Le 01/04/2017 à 19:31, Stephane Ducasse a écrit :
Hi

I'm trying to understand what are the idioms in Smacc when converting from
ANTLR

######### the case of * ########################
Function = ‘(‘ (',' Arguments )* ‘)’

Function: "(" ( Argument ("," Argument) * ) ? ")" {{}} ;

Argument: <identifier> 'argument' ;

This one in SmaCC github, gives you exactly what you want (a Function ast node with an instance variable named arguments containing a possibly empty list of arguments) and is equivalent to your transform below.

Even more concise; one can put the instance variable name in the top-level expression, and SmaCC will infer the list behavior:

Function: "(" (Expression 'argument' ("," Expression 'argument')*)? {{}} ;

     should be transformed into

Function
: <name> "(" 'leftParen' _ArgumentsOption  ")" 'rightParen' {{}}
;
_ArgumentsOption
:
| Arguments
;
Arguments
: Expression 'argument'
| Arguments "," Expression 'argument'
;

Here since there is a recursion in Arguments
the instance variable containing a list of argument will be added to the
FunctionNode
Pay attention that Expression 'argument' should not have a {{}} nor its
parent rule.


######### the case of + ########################
Function = ‘(‘  Arguments + ‘)’

Function: "(" Argument 'argument' ("," Argument 'argument') * ")";

Argument: <identifier> ;

     should be transformed into

Function
: <name> "(" 'leftParen' _ArgumentsOption  ")" 'rightParen' {{}}
;
_ArgumentsOption
: Arguments
;
Arguments
: Expression 'argument'
| Arguments "," Expression 'argument'
;



######### the case of ? ########################
Function = ‘(‘  Arguments+ ‘)’

Function = '(' Arguments? ')', that is:

Function: "(" (Arguments 'argument') ? ")";

You need the parenthesis here. This is a bug, it should accept

Function: "(" Arguments 'argument' ? ")" ;

I'll add an issue and improve the SmaCC grammar grammar.


     should be transformed into

Function
: <name> "(" 'leftParen' _ArgumentsOption  ")" 'rightParen' {{}}
;
_ArgumentsOption
:
| Arguments
;
Arguments
: Expression 'argument'
;



Is there a more compact way to express?

With +, *, ? and () of course :)

Thierry do you have example of *, + , ? in the grammar?

No, not that many. I did not use them much professionally, and then I didn't make the effort to check that the AST annotations would work correctly with them, so I had a tendancy to remove them.

This is the first time I'm really checking that annotations work properly over those syntax extensions.

The initial (1.X) version of thoses annotations were not compatibles with the AST annotations, so I had back then to hack the SmaCC 2.0.3 base to support them, without having the time to check it was done properly on the annotation level.

Thierry

Stef


Reply via email to