|
Et eksempel på kode der let kan blive kompliceret er dette stykke fra Pas2Java, som håndterer en parameter med formatering - som i writeln(x:8:3). Her er brugt en 1-pass arkitektur i ren JavaCC.
String ParameterWithField() :
{
String s, s1, s2;
String res;
}
{
( s = Expression() { res = s; }
( ":" s1 = Expression()
{ if (s1.equals("1"))
{ res = s; }
else
{ res = "Tal.dec("+s+","+s1+")";
stackframe.firstElement().addUse("com.sf.tal.*");
}
}
( ":" s2 = Expression()
{ res = "Tal.dec("+s+","+s1+","+s2+")";
stackframe.firstElement().addUse("com.sf.tal.*");
}
)?
)?
)
{ return res; }
}
Hvis man i stedet bygger en Semantic Model kan man skille processen i flere trin - parsing, semantisk analyse og kodegenerering. Parsing koden ser så sådan her ud, når man bruger JTB sammen med JavaCC:
void ParameterWithoutField() : { }
{
Expression()
}
void ParameterWithField1() : { }
{
Expression() ":" Expression()
}
void ParameterWithField2() : { }
{
Expression() ":" Expression() ":" Expression()
}
void ParameterWithFields() : { }
{
LOOKAHEAD(10000) ParameterWithField2() |
LOOKAHEAD(10000) ParameterWithField1() |
LOOKAHEAD(10000) ParameterWithoutField()
}
Koden, der håndterer dette er så placeret i en JTB Visitor:
@Override
public NodeResponse visit(final ParameterWithField2 n, final VisitorContext context)
{
// Walk the Abstract Syntax Tree
Evaluated expression = (Evaluated)n.expression.accept(this, context);
n.nodeToken.accept(this, context);
Evaluated format1 = (Evaluated)n.expression1.accept(this, context);
n.nodeToken1.accept(this, context);
Evaluated format2 = (Evaluated)n.expression2.accept(this, context);
// Build the Semantic Model
VODereferencedList vod = new VODereferencedList(context);
LinkedList flist = new LinkedList();
flist.add(format1);
flist.add(format2);
vod.dereferencelist.add(new VODereferencedByFormatting(context, flist));
VOActualParameter ap = new VOActualParameter(context, expression, vod);
return ap;
}
@Override
public NodeResponse visit(final ParameterWithFields n, final VisitorContext context)
{
// Walk the Abstract Syntax Tree, nothing to add to the Semantic Model
return n.nodeChoice.accept(this, context);
}
|