Java ANTLRworks从语法创建解释器
嘿,我有一个简短的问题。我正在使用ANTLRworks从一组语法创建Java解释器。我本来打算手写出来的,但后来意识到我不必写,因为我的作品。不过我有这个错误 T.g:9:23:标签ID与同名令牌冲突 当从语法创建解释器时,ANTLRworks是一种方法。你们看到我的代码有错误吗 我试图使身份证一个字母从a-z和不区分大小写。每个词素之间都有空白。多谢各位Java ANTLRworks从语法创建解释器,java,grammar,interpreter,antlrworks,Java,Grammar,Interpreter,Antlrworks,嘿,我有一个简短的问题。我正在使用ANTLRworks从一组语法创建Java解释器。我本来打算手写出来的,但后来意识到我不必写,因为我的作品。不过我有这个错误 T.g:9:23:标签ID与同名令牌冲突 当从语法创建解释器时,ANTLRworks是一种方法。你们看到我的代码有错误吗 我试图使身份证一个字母从a-z和不区分大小写。每个词素之间都有空白。多谢各位 grammar T; programs : ID WS compound_statement; statement: if
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> → + | - | * | /
代码中可能存在的一些问题: 我认为您希望您的ID标记具有+正则表达式,以便其长度可以为1或更多,如下所示:
ID : ('a'..'z'|'A'..'Z'|'_')+
;
您的=符号周围似乎也缺少引号:
编辑
关于左边的递归问题:由于正则表达式的功能,ANTLR非常强大。虽然像您所介绍的EBNF可能在表达事物的方式上受到限制,但ANTLR可以用于以更简单的方式表达某些语法规则。例如,如果希望在复合语句中有一个语句列表,只需将语句规则与闭包*一起使用即可。像这样:
compound_statement: 'begin' statement* 'end';
突然,您可以删除不必要的规则,如语句列表
当从语法创建解释器时,ANTLRworks是一种方法
没有
ANTLRWorks只能用于编写语法,并可能测试它是否通过调试器或解释器正确输入。它不能用于为您编写语法的语言创建解释器。ANTLRWorks只是一个奇特的文本编辑器,仅此而已
你们看到我的代码有错误吗
正如Treebranch所指出的:您在=登录时没有引号:
让ANTLR认为您想将标签ID分配给解析器规则算术表达式,这是非法的:在您的情况下,标签名不能同时也是规则ID的名称。谢谢,我现在修复了这些问题,这弹出了哈哈。TODO:运行并将输出发送到此控制台[12:26:51]error211:T.g:6:15:[致命]规则语句\u列表具有非LL决策,因为可以从alts 1,2访问递归规则调用。通过左因子分解或使用语法谓词或使用backtrack=true选项进行解析。[12:26:51]错误211:X:\Users\Zahc\Documents\T.g:6:15:[致命]规则语句\u列表具有非LL决策,因为可以从alts 1,2访问递归规则调用。通过左因子分解或使用语法谓词或使用backtrack=true选项来解析。所以除了这些,我的代码看起来还可以吗?很抱歉,这些新问题我只是新手。我还没有深入研究你的代码,我只是想提出一些改进的方法,让你了解ANTLR的表达能力。如果你有机会,你能吗?这段代码将用java创建一个解释器,对吗?我建议您做的是获得ANTLR eclipse插件,并将您的代码带到那里,为您的语法编写一组测试用例进行解析,然后运行它们以查看语法的哪些部分按预期工作,哪些部分不按预期工作。
compound_statement: 'begin' statement* 'end';
assignment_statement: ID = arithmetic_expression;