我正在尝试使用 ANTLR 编写语法,但我无法理解 antlr 如何处理递归选择。
我阅读了很多文章和论坛,但无法解决我的问题...
这是我语法的一小部分:
grammar MyGrammar;
ComponentRef :
IDENT ('[' Expression (',' Expression)* ']')?
;
Expression:
ComponentRef ('(' FunctionArguments ')')?
;
FunctionArguments:
Expression (',' Expression)*
;
IDENT: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
Run Code Online (Sandbox Code Playgroud)
我仍然不明白为什么它不起作用......没有歧义!不是吗?
以下是我的语法应该使用的一些代码示例:
a
a[b,c]
a[b[c], d]
func(a)
func(a,b,c)
func[a](b,c)
func(a[b], c[d])
func[a](b[c])
Run Code Online (Sandbox Code Playgroud)
提前谢谢你!
首先,一定要了解词法分析器和解析器规则。另请阅读ANTLR Mega 教程。
该代码仅使用词法分析器规则,这是行不通的。尽管甚至词法分析器规则也可以递归(在 ANTLR 语法中),但最好避免使用它们。相反,大多数规则应该是解析器规则:
componentRef :
IDENT ('[' expression (',' expression)* ']')?
;
expression:
componentRef ('(' functionArguments ')')?
;
functionArguments:
expression (',' expression)*
;
IDENT: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
Run Code Online (Sandbox Code Playgroud)
上面的语法将无法识别您发布的输入,但不再有错误。识别您发布的输入的语法可能如下所示(未经测试!)语法:
parse
: expr* EOF
;
expr
: IDENT (index | call)*
;
index
: '[' expr_list ']'
;
call
: '(' expr_list ')'
;
expr_list
: expr (',' expr)*
;
IDENT
: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
;
SPACE
: (' ' | '\t' | '\r' | '\n')+ {skip();}
;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3439 次 |
最近记录: |