我怎样才能消除以下规则的歧义?
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
后跟 =>
,但这可能会使整个语言变得模棱两可。
我在使用 输入 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
后跟 =>
,但这可能会使整个语言变得模棱两可。