我该如何消除以下规则的歧义?

时间:2015-06-06 19:47:08

标签: antlr antlr4

我在使用以下规则输入sqr(没有可行的替代方法时遇到问题。

function_invocation : ID LPAREN term (',' term)* RPAREN ;

function_signature : ID LPAREN ID (',' ID)* RPAREN ;

term : function_invocation #functionTerm
     | number              #numberTerm
     | string              #stringTerm
     | ID                  #idTerm
     ;

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

我在其他规则中使用function_signature,我只希望ID有效,例如:

function_definition : function_signature '=>' expression (','NL expression)* '.'NL ;

应解析:

sqr(x) => x * x,
          x + 1.

我使用function_invocation我想要的不仅仅是ID

function_assignment : ID '=>' function_invocation ;

应解析:

z = sqr(3)

问题是ID是有效的term

我如何告诉ANTLR4告诉两者之间的差异?

1 个答案:

答案 0 :(得分:2)

这样function_signature只能在function_definition内使用。换句话说,完全放弃该规则,并写下

function_definition : ID '(' ID (',' ID)* ')' '=>' expression (',' NL expression)* '.' NL ;

这样,=>终端可用于避免歧义。或者,只需将=>终端放在function_signature

function_signature : ID '(' ID (',' ID)* ')' '=>' ;
function_definition : function_signature expression (',' NL expression)* '.' NL ;

当然,我假设你的语法中没有其他地方允许function_invocation后跟=>,但这可能会使整个语言模糊不清。