Hi all,

I'm building a language to language translator with C++ as target language.  
I've built a
preliminary version of the language description and I try to produce some  
output using
StringTemplate. It works so far but I'm looking for some simplifications of my  
output
rules.

The first rule of interest is my "expr" rule that should build expressions. It  
looks like
this:

expr
     :(  ^(op=OP_EQ l=expr r=expr)
     |   ^(op=OP_NE l=expr r=expr)
     |   ^(OP_LT l=expr r=expr)
     |   ^(OP_GT l=expr r=expr)
     |   ^(OP_PLUS l=expr r=expr)
     |   ^(OP_MINUS l=expr r=expr)
     |   ^(OP_MUL l=expr r=expr)
     |   ^(OP_DIV l=expr r=expr)
     |   ^(OP_IDIV l=expr r=expr)
         )           -> dyadExpr(op={$$$$},left={$l.st},right={$r.st})
     |   ID          -> template(id={$ID.text}) "<id>"
     |   literal     -> dumpSt(stVal={$literal.st})
     ;

All the OP_* nodes could be handled by one template "dyadExpr" with the  
parameters "op",
"left" and "right". But I need a way to specify the needed operator. Putting  
"$op.type"
in the above rule at the point where "$$$$" is yield the lexer token number.  
Any ideas
how to connect the token number with the appropriate operator string? The maps  
in the
StringTemplate Group only support mapping strings to strings.


The second problem is that some rules simply need to deliver the output of  
another rule.
I solved this by introducing a helper template "dumpSt" that simply delivers  
the given
input. The helper template is defined in the *.stg file as follows:

// Simply dump the value of another string template call
dumpSt(stValue)    ::= "<stVal>"

An example of the rules that refer to this helper template is following:

/** Declarations allowed on MODULE level */
mod_dcl
     :   var_dcl    -> dumpSt(stVal={$var_dcl.st})
     |   func_dcl   -> dumpSt(stVal={$func_dcl.st})
     |   proc_dcl   -> dumpSt(stVal={$proc_dcl.st})
     ;

var_dcl:
     ^(VAR_DCL basicType (i+=ID)+)
     -> var_dcl(type={$basicType.st}, names={$i})
     ;

basicType
     :   'FIXED' -> dumpSt(stVal={"int16_t"})
     |   'FLOAT' -> dumpSt(stVal={"float"})
     ;

Could I get rid of the "dumpSt" template in "mod_dcl" rule and write that more  
directly.
In the "basicType" rule is it possible to get the "int16_t" down into the  
*.stg file?

Any hints appreciated. Thanks.

Best regards,
        Stefan Mätje

List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe: 
http://www.antlr.org/mailman/options/antlr-interest/your-email-address

-- 
You received this message because you are subscribed to the Google Groups 
"il-antlr-interest" group.
To post to this group, send email to il-antlr-inter...@googlegroups.com.
To unsubscribe from this group, send email to 
il-antlr-interest+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/il-antlr-interest?hl=en.

Reply via email to