我在使用以下规则输入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
。
答案 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
后跟=>
,但这可能会使整个语言模糊不清。