0

我正在尝试使用 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')*;

我仍然不明白为什么它不起作用......没有歧义!不是吗?

以下是我的语法应该使用的一些代码示例:

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])

提前谢谢你!

4

2 回答 2

6

首先,一定要了解词法分析器和解析器规则。另请阅读ANTLR Mega 教程

该代码仅使用词法分析器规则,这是行不通的。尽管即使词法分析器规则也可以是递归的(在 ANTLR 语法中),但最好避免使用它们。相反,大多数规则应该是解析器规则:

componentRef :
    IDENT ('[' expression (',' expression)* ']')?
;

expression:
    componentRef ('(' functionArguments ')')?
;

functionArguments:
   expression (',' expression)*
;

IDENT: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;

上面的语法无法识别您发布的输入,但不再有错误。识别您发布的输入的语法可能如下所示(未经测试!)语法:

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();}
 ;
于 2012-06-12T11:10:05.930 回答
-1

我假设您的国会大厦表达式是一个错误。您可能打算输入小写字母。

你怎么能说没有歧义?表达式调用 functionArguments,functionArguments 调用表达式。-1

于 2018-02-14T19:34:26.507 回答