首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BNFC规则中的不良胁迫

BNFC规则中的不良胁迫
EN

Stack Overflow用户
提问于 2016-03-20 06:25:32
回答 1查看 304关注 0票数 0

我正试图用BNFC编写一个编译器。我将使用BNFC来生成抽象语法树。但是,我得到了错误,我似乎不知道为什么。它似乎没有太多的文档。

以下是我所犯的错误:

代码语言:javascript
复制
Bad coercion in rule _. Prog ::= Block
Bad coercion in rule _. Declarations ::= Declaration ";" Declarations
Bad coercion in rule _. Declarations ::=
Bad coercion in rule _. Declaration ::= Var_declaration
Bad coercion in rule _. Declaration ::= Fun_declaration
Bad coercion in rule _. Type ::= "int"
Bad coercion in rule _. Type ::= "real"
Bad coercion in rule _. Type ::= "bool"
Bad coercion in rule _. Array_dimensions ::= "[" Expr "]" Array_dimensions
Bad coercion in rule _. Array_dimensions ::=
Bad coercion in rule _. Fun_block ::= Declarations Fun_body
Bad coercion in rule _. Param_list ::= "(" Parameters ")"
Bad coercion in rule _. Parameters ::= Basic_declaration More_parameters
Bad coercion in rule _. Parameters ::=
Bad coercion in rule _. More_parameters ::= "," Basic_declaration More_parameters
Bad coercion in rule _. More_parameters ::=
Bad coercion in rule _. Basic_declaration ::= Ident Basic_array_dimensions ":" Type
Bad coercion in rule _. Basic_array_dimensions ::=
Bad coercion in rule _. Program_body ::= "begin" Prog_stmts "end"
Bad coercion in rule _. Fun_body ::= "begin" Prog_stmts "return" Expr ";" "end"
Bad coercion in rule _. Prog_stmts ::= Prog_stmt ";" Prog_stmts
Bad coercion in rule _. Prog_stmts ::=
Bad coercion in rule _. Identifier ::= Ident Array_dimensions
Bad coercion in rule _. Expr ::= Bint_term
Bad coercion in rule _. Bint_term ::= Bint_factor
Bad coercion in rule _. Bint_factor ::= Int_expr Compare_op Int_expr
Bad coercion in rule _. Bint_factor ::= Int_expr
Bad coercion in rule _. Int_expr ::= Int_expr Addop Int_term
Bad coercion in rule _. Int_expr ::= Int_term
Bad coercion in rule _. Int_term ::= Int_term Mulop Int_factor
Bad coercion in rule _. Int_term ::= Int_factor
Bad coercion in rule _. Int_factor ::= "(" Expr ")"
Bad coercion in rule _. Modifier_list ::= "(" Arguments ")"
Bad coercion in rule _. Modifier_list ::= Array_dimensions
Bad coercion in rule _. Arguments ::= Expr More_arguments
Bad coercion in rule _. Arguments ::=
Bad coercion in rule _. More_arguments ::= "," Expr More_arguments
Bad coercion in rule _. More_arguments ::=

下面是BNFC文件的示例:

代码语言:javascript
复制
_.Prog ::= Block;

M_Prog. Block ::= Declarations Program_body;

_.Declarations ::= Declaration ";" Declarations;
_. Declarations ::= ;

_. Declaration ::= Var_declaration;
_. Declaration ::= Fun_declaration;

M_Var. Var_declaration ::= "var" Ident Array_dimensions ":" Type;

_. Type ::= "int";
_. Type ::= "real";
_. Type ::= "bool"; 

_. Array_dimensions ::= "[" Expr "]" Array_dimensions;
_. Array_dimensions ::=;

M_Fun. Fun_declaration ::= "fun" Ident Param_list ":" Type "{" Fun_block "}";

_. Fun_block ::= Declarations Fun_body; 

_. Param_list ::= "(" Parameters ")";

_. Parameters ::= Basic_declaration More_parameters;
_. Parameters ::= ;

_. More_parameters ::= ","  Basic_declaration More_parameters;
_. More_parameters ::= ;

_. Basic_declaration ::= Ident Basic_array_dimensions ":" Type;

_. Basic_array_dimensions ::= "[" "]" Basic_array_dimensions;
_. Basic_array_dimensions ::=;

我似乎不正确地使用了_.标签。但是手册中只有一两行描述它的用法。我在这里做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-28 19:03:29

来自文档

当然,在值类型与参数类型相同的情况下,下划线仅作为一个参数构造函数的替换有意义。

这意味着,只有在规则的右侧有一个非终端,并且非终端与左侧站点相同的情况下,您才能使用_。所以您可以做一些类似_. A ::= "(" A ")" ;的事情,但不能做_. A ::= "(" B ")" ;_. A ::= "(" A A ")" ;

在您的示例中,我建议您为每条规则指定一个标签,在某些情况下,_主要用于简化AST。

顺便说一句,物品清单还有一个语法快捷方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36110853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档