Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ANTLRworks从语法创建解释器_Java_Grammar_Interpreter_Antlrworks - Fatal编程技术网

Java ANTLRworks从语法创建解释器

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

嘿,我有一个简短的问题。我正在使用ANTLRworks从一组语法创建Java解释器。我本来打算手写出来的,但后来意识到我不必写,因为我的作品。不过我有这个错误

T.g:9:23:标签ID与同名令牌冲突

当从语法创建解释器时,ANTLRworks是一种方法。你们看到我的代码有错误吗

我试图使身份证一个字母从a-z和不区分大小写。每个词素之间都有空白。多谢各位

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;