Джаррод Роберсон писал:
Мне действительно нравятся вещи, которые можно компилировать / работать без предупреждений. Как мне разрешить это условие предупреждения?
Ваш синтаксический анализатор может проанализировать следующий ввод:
f(x)-> g(y)-> y*y, x=y
в двух разных деревьях разбора:
и
Вы можете исправить это, заставив парсер посмотреть вперед и убедившись, что впереди ',' statement
, прежде чем фактически соответствовать этим правилам. Вы можете сделать это, используя синтаксический предикат (часть (...)=>
) с указанным правилом внутри:
function
: ID '(' args ')' '->' statement ((',' statement)=> ',' statement)*
;
Однако предикат вам не нужен, если ваше правило function
имеет своего рода "конечный" токен, который вы не определили. Из ваших предыдущих вопросов и вашего примера:
myfunction(x) ->
sqr(a) -> a * a,
y = sqr(x).
кажется, вы используете '.'
в качестве конца function
. Если вы добавите это к своему правилу function
:
function
: ID '(' args ')' '->' statement (',' statement)* '.'
;
вам вообще не нужен предикат.