我怎样才能消除以下规则的歧义?

How can I disambiguate the following rules?

我在使用 输入 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'|'_')* ;

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

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 区分两者?

使 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 后跟 =>,但这可能会使整个语言变得模棱两可。