Java ANTLR 4语言在未正确使用时工作

Java ANTLR 4语言在未正确使用时工作,java,syntax,antlr,Java,Syntax,Antlr,因此,我在ANTLR 4和Java的帮助下为自己构建了一种非常小的基本编程语言。除我的循环语句外,一切正常。在我的语法中,我已经说过,所有语句在键入时都应该后跟分号(“;”),循环执行代码应该有大括号。这是我语法文件中的内容: code :statement ';' code ; statement :loop ; loop :'när:' expr otherBlock ; otherBlock :'('file')' | code ; expr :expr op=('/' | '*

因此,我在ANTLR 4和Java的帮助下为自己构建了一种非常小的基本编程语言。除我的循环语句外,一切正常。在我的语法中,我已经说过,所有语句在键入时都应该后跟分号(“;”),循环执行代码应该有大括号。这是我语法文件中的内容:

code
:statement ';' code
;

statement
:loop
;

loop
:'när:' expr otherBlock
;


otherBlock
:'('file')'
| code
;

expr
:expr op=('/' | '*') expr              #mullExpr
|expr op=('+' | '-') expr              #addExpr
|expr op=('<='|'>=' | '<' | '>') expr  #relExpr
|atomExpr                              #atom
;

atomExpr
:INT    #numberAtom
|ID     #idAtom
|STR    #stringAtom
;
code
:语句“;”代码
;
陈述
:循环
;
环
:'när:'expr otherBlock
;
其他块
:“('file')”
|代码
;
expr
:expr op=(“/”|“*”)expr#mullExpr
|expr op=(“+”|“-”)expr#addExpr
|expr op=('='|''')expr#relExpr
|原子
;
atomExpr
:INT#numberAtom
|我是汤姆
|STR#stringAtom
;
下面是一些测试它的代码(只是一个循环,循环重复10次,将所有数字相加,然后打印结果:

variabel index = 0;
variabel nummer = 10;
variabel resultat = 1;

när: index <= nummer
(
    resultat = resultat + index;
    index = index+1;
);

skriv resultat;
line 9:0 no viable alternative at input ')'
line 11:0 missing ';' at 'skriv'
line 12:0 no viable alternative at input '<EOF>'
resultat=56.0

Process finished with exit code 0
variabel索引=0;
variabel nummer=10;
variabel resultat=1;

när:index
code:statement';'code;
该规则无限期地递归。为什么不使用
code:(statement';'))*
相反?另外,你发布的语法显然不完整,因为它只允许循环…我尝试了你的建议,但我不知道为什么。你的意思是代码让它永远称自己?我还从问题中省略了代码/语法,因为我认为这是不必要的。我的意思是,这条规则需要第二个替代分支h来结束递归。我不知道ANTLR是如何解释的,但正如您所看到的,它并没有达到预期的效果。
code:statement';“code;
该规则无限递归。为什么不使用
code:(statement';'))*
相反?另外,你发布的语法显然不完整,因为它只允许循环…我尝试了你的建议,但我不知道为什么。你的意思是代码让它永远称自己?我还从问题中省略了代码/语法,因为我认为这是不必要的。我的意思是,这条规则需要第二个替代分支我不知道ANTLR是如何解释的,但是正如你所看到的,它没有达到你想要的效果。
line 9:0 no viable alternative at input ')'
line 11:0 missing ';' at 'skriv'
line 12:0 no viable alternative at input '<EOF>'
resultat=56.0

Process finished with exit code 0