Code: Select all
productions
EXPRESSION =
/*
This expression without the cursor tracking generates valid code*/
/*EXPRESSION plus EXPRESSION -> plus(EXPRESSION, EXPRESSION),*/
/*
With the :CURSOR the generated invalid code*/
EXPRESSION plus:CURSOR EXPRESSION -> plus(EXPRESSION, CURSOR, EXPRESSION)
/*
Other arithmetic expressions come here*/
--
int(INTEGER) -> int(INTEGER),
real(REAL) -> real(REAL)
Code: Select all
clauses
s_expression(LL1,LL0,EXPRESSION):-
s_expression1(LL1,LL0,EXPRESSION).
s_expression1(LL1,LL0,EXPRESSION_):-
s_expression2(LL1,LL2,EXPRESSION),
s_expression3(LL2,LL0,EXPRESSION,EXPRESSION_).
s_expression2([t(int(INTEGER),_)|LL],LL,int(INTEGER)):-!.
s_expression2([t(real(REAL),_)|LL],LL,real(REAL)):-!.
s_expression2(LL,_,_):-syntax_error("Expression2",LL),fail.
s_expression3([t(plus,CURSOR)|LL1],LL0,EXPRESSION,EXPRESSION_):-!,
s_expression2(LL1,LL2,EXPRESSION1),
s_expression3(LL2,LL0,plus(EXPRESSION,CURSOR,EXPRESSION1),EXPRESSION_) ,CURSOR=EXPRESSION,EXPRESSION=CURSOR.
/*
The generator should not produce this additional bit ,CURSOR=EXPRESSION,EXPRESSION=CURSOR. in the previous line*/
s_expression3(LL,LL,EXPRESSION,EXPRESSION).