ANTLRworks从语法创建解释器

时间:2012-02-03 16:48:55

标签: java grammar interpreter antlrworks

嘿,我有一个简单的问题。我正在使用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> → + | - | * | / 

2 个答案:

答案 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。