Danish(DK)English (United Kingdom)
Krøllede konstruktioner

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); }