我在ANTLR语法中写下了以下声明:
loopStatement
: 'loop' (statement|exit)* 'end' 'loop' ';'
;
如果我理解正确,(statement|exit)*
表示我可以拥有statement
或exit statement
。那是
即statement_1 exit_1
,或statement_1
,或statement_1 statement_2, exit_1
,对吗?
我的解析器工作,除非没有声明
例如:
这有效:
loop
x:=x+1; <<< statement_1
exit when x=9; <<<<exit_1
end loop;
这也有效(没有exit
):
loop
x:=x+1; <<< statement_1
<<<<exit_1 (no exit)
end loop;
但不工作(没有statement
):
loop
<<< statement_1
exit when x=9; <<<<exit_1
end loop;
我的语法有什么问题吗?
答案 0 :(得分:3)
pantelis写道:
如果我理解正确,
(statement|exit)*
表示我可以拥有statement
或exit statement
。
准确地说,(statement|exit)*
匹配空字符串,或零个或多个statement
或exit
语句(没有特定顺序!)。所以它匹配:
但是,为什么不让你的exit
陈述只是一个常规陈述?我小演示:
loopStatement
: 'loop' statement* 'end' 'loop' ';'
;
statement
: 'exit' 'when' expression ';' // exit statement
| ID ':=' expression ';' // assignment
;
expression
: equalityExpression
;
equalityExpression
: addExpression ('=' addExpression)*
;
addExpression
: atom ('+' atom)*
;
atom
: ID
| Number
| '(' expression ')'
;
ID
: 'a'..'z'+
;
Number
: '0'..'9'+
;
正确解析所有3个例子:
loop
x:=x+1;
exit when x=9;
end loop;
loop
x:=x+1;
end loop;
loop
exit when x=9;
end loop;
或者根本没有:
loop
end loop;