嘿,我有一个简单的问题。我正在使用ANTLRworks从一组语法中用Java创建一个解释器。我打算用手写出来然后意识到我没有因为antlrworks。我收到此错误
T.g:9:23:标签ID与同名的标记冲突
从语法创建解释器时,ANTLRworks是否可行。您是否在我的代码中看到任何错误?
我正在尝试从a-z创建ID一个字母而不区分大小写。并且在每个词位之间都有空格。谢谢你
grammar T;
programs : ID WS compound_statement;
statement:
if_statement|assignment_statement|while_statement|print_statement|compound_statement;
compound_statement: 'begin' statement_list 'end';
statement_list: statement|statement WS statement_list;
if_statement: 'if' '(' boolean_expression ')' 'then' statement 'else' statement;
while_statement: 'while' boolean_expression 'do' statement;
assignment_statement: ID = arithmetic_expression;
print_statement: 'print' ID;
boolean_expression: operand relative_op operand;
operand : ID |INT;
relative_op: '<'|'<='|'>'|'>='|'=='|'/=';
arithmetic_expression: operand|operand WS arithmetic_op WS operand;
arithmetic_op: '+'|'-'|'*'|'/';
ID : ('a'..'z'|'A'..'Z'|'_').
;
INT : '0'..'9'+
;
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
这是语法
<program> → program id <compound_statement>
<statement> → <if_statement> | <assignment_statement> | <while_statement> |
<print_statement> | <compound_statement>
<compound_statement> → begin <statement_list> end
<statement_list> → <statement> | <statement> ; <statement_list>
<if_statement> → if <boolean_expression> then <statement> else <statement>
<while_statement> → while <boolean_expression> do <statement>
<assignment_statement> -> id := <arithmetic_expression>
<print_statement> → print id
<boolean_expression> → <operand> <relative_op> <operand>
<operand> → id | constant
<relative_op> → < | <= | > | >= | = | /=
<arithmetic_expression> → <operand> | <operand> <arithmetic_op> <operand>
<arithmetic_op> → + | - | * | /
答案 0 :(得分:0)
从语法创建解释器时,ANTLRworks是否可行。
没有
ANTLRWorks只能用于编写语法并可能测试它是否正确输入(通过其调试器或解释器)。它不能用于为您编写语法的语言创建解释器。 ANTLRWorks只是一个花哨的文本编辑器,仅此而已。
您是否在我的代码中看到任何错误?
如Treebranch所示:您在=
登录时没有引号:
assignment_statement: ID = arithmetic_expression;
让ANTLR“想”您想要将标签ID
分配给解析器规则arithmetic_expression
,这是非法的:您不能拥有也是规则名称的标签名称(ID
,在您的情况下)。
答案 1 :(得分:-1)
代码中的一些可能问题:
我认为你希望你的ID标签有一个+
正则表达式,所以它的长度可以是1或更多,如下所示:
ID : ('a'..'z'|'A'..'Z'|'_')+
;
您的=
标志旁边的引号也似乎缺失:
assignment_statement: ID '=' arithmetic_expression;
修改强>
关于左递归问题:由于正则表达式功能,ANTLR非常强大。虽然EBNF(就像你提出的那样)在表达事物的方式上可能受到限制,但是ANTLR可以用更简单的方式表达某些语法规则。例如,如果你想在compound_statement中有一个statement_list,只需使用带有闭包的{em>语句规则(*
)。像这样:
compound_statement: 'begin' statement* 'end';
突然,您可以删除不必要的规则,例如statement_list。