0

嘿,我有一个快速的问题。我正在使用 ANTLRworks 从一组语法中创建一个 Java 解释器。我打算用手把它写出来,但后来意识到我没有必要因为 antlrworks。虽然我收到了这个错误

Tg:9:23:标签 ID 与同名令牌冲突

从语法创建解释器时,ANTLR 是否可行。你们在我的代码中看到任何错误吗?

我正在尝试将 ID 设为一个来自 az 的字母,并且不区分大小写。并在每个词位之间留有空白。谢谢你

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> → + | - | * | / 
4

2 回答 2

0

从语法创建解释器时,ANTLR 是否可行。

不。

ANTLRWorks 只能用于编写您的语法并可能测试它是否正确输入(通过其调试器或解释器)。它不能用于为您为其编写语法的语言创建解释器。ANTLRWorks 只是一个花哨的文本编辑器,仅此而已。

你们在我的代码中看到任何错误吗?

=正如 Treebranch 所指出的:您在登录时没有引号:

assignment_statement:   ID = arithmetic_expression;

让 ANTLR “认为”你想将标签分配给ID解析器规则arithmetic_expression,这是非法的:你不能有一个标签名称也是规则的名称(ID在你的情况下)。

于 2012-02-03T23:06:22.917 回答
-1

您的代码中可能存在的一些问题:

我认为您希望您的 ID 标签有一个+正则表达式,以便它的长度可以为 1 或更多,如下所示:

ID  :   ('a'..'z'|'A'..'Z'|'_')+
;

看起来您的=标志周围缺少引号:

assignment_statement:   ID '=' arithmetic_expression;

编辑

关于您的左递归问题:由于正则表达式功能,ANTLR 非常强大。虽然 EBNF(如您介绍的那个)可能在表达事物的方式上受到限制,但 ANTLR 可用于以更简单的方式表达某些语法规则。例如,如果您想在您的复合语句中有一个 statement_list,只需将您的语句规则与闭包 ( *) 一起使用。像这样:

compound_statement: 'begin' statement* 'end';

突然间,您可以删除不必要的规则,例如 statement_list。

于 2012-02-03T17:23:51.897 回答