/* $Id$ * * Grammer for the etch idl compiler. */ options { JAVA_UNICODE_ESCAPE = false; STATIC = false; JDK_VERSION = "1.5"; OUTPUT_DIRECTORY = "../../../target/generated-sources/main/javacc/java/etch/compiler"; } PARSER_BEGIN(EtchGrammar) package etch.compiler; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import etch.compiler.ast.Constant; import etch.compiler.ast.Enumx; import etch.compiler.ast.Except; import etch.compiler.ast.Service; import etch.compiler.ast.Item; import etch.compiler.ast.Message; import etch.compiler.ast.Module; import etch.compiler.ast.Name; import etch.compiler.ast.Opt; import etch.compiler.ast.ParamList; import etch.compiler.ast.Parameter; import etch.compiler.ast.Struct; import etch.compiler.ast.Thrown; import etch.compiler.ast.TypeRef; /** The JavaCC grammar file for the etch compiler. */ public class EtchGrammar extends EtchHelper { public EtchGrammar( Backend b, InputStream is ) { this( is ); this.binding = b; } private Backend binding; } PARSER_END(EtchGrammar) /* * Tokens to ignore in the BNF follow. */ SKIP : { <" "> | <"\t"> | <"\r"> | <"\n"> | <"\f"> | | } SPECIAL_TOKEN : { | } TOKEN : { | | | | | | | | | | | | | | | | | | | | | | | | | ( "." )+> | <#INT_LIT : ["1"-"9"] (["0"-"9"])*> | <#SGN : (["-"])?> | ("0" | )> | | | | <#EXP : ["e", "E"] > | <#FRACTION : "." (["0"-"9"])+> | ( "." (["0"-"9"])* )? ) | ( "." (["0"-"9"])* ()?) | ( ()?)> | | | | | | | | | | } Module module( CmdLineOptions cmdLineOptions ) : { Module m; } { m = module_stmt( cmdLineOptions ) service( m ) { return m; } } Module module_stmt( CmdLineOptions cmdLineOptions ) : { Token k; Token t; } { k = t = xid() ( )? { Module m = new Module( new Name( t, t.image ), cmdLineOptions ); moduleComment( m, k.specialToken ); return m; } } void service( Module m ) : { Map opts; Token k; Name n; Service i; } { { doStartService(); } opts = opts() k = n = def() { saveComment( k.specialToken ); i = m.addService( n, opts ); serviceComment( i, getComment() ); binding.addDefaults( i ); } stmts( i ) { doEndService( i ); } } Map opts() : { Map map = new HashMap(); Opt o; } { ( o = opt() { map.put( o.name(), o ); } )* { return map; } } Opt opt() : { Token k; Token n; List list = new ArrayList(); } { k = n = id() { saveComment( k.specialToken ); } ( args( list ) )? { return makeOpt( new Name( n, n.image ), list ); } } void args( List list ) : { Token v; } { v = arg() { list.add( v ); } ( v = arg() { list.add( v ); } )* } Token arg() : { Token t; } { ( t = cvalue() | t = ref() | t = ) { return t; } } Token cvalue() : { Token t; } { ( t = | t = | t = | t = | t = | t = | t = | t = { fixString( t ); } ) { return t; } } void stmts( Service i ) : { Map opts; } { ( opts = opts() ( mixin_stmt( i, opts ) | include_stmt( i, opts ) | const_stmt( i, opts ) | enum_stmt( i, opts ) | struct_stmt( i, opts ) | extern_stmt( i, opts ) | exception_stmt( i, opts ) | message_stmt( i, opts ) ) )* } void mixin_stmt( Service i, Map opts ) : { Token t; } { t = ref() ( )? { i.addMixin( new Name( t, t.image ), opts ); } } void include_stmt( Service i, Map opts ) : { Token f; } { f = ( )? { doInclude( f, i ); } } void const_stmt( Service i, Map opts ) : { Token k; TypeRef tr; Name n; Token v; } { k = tr = ctype() n = def() v = cvalue() ( )? { Constant c = i.addConstant( n, opts, tr, v ); constantComment( c, k.specialToken ); } } void enum_stmt( Service i, Map opts ) : { Token k; Name n; Enumx e; } { k = n = def() { e = i.addEnum( n, opts ); enumComment( e, k.specialToken ); } item_list( e ) ( )? } void item_list( Enumx e ) : { Name n; Item i; } { n = def() { i = e.addItem( n ); itemComment( i, n.token.specialToken ); } ( n = def() { i = e.addItem( n ); itemComment( i, n.token.specialToken ); } )* } void struct_stmt( Service i, Map opts ) : { Token k; Name n; Struct s; Token x; Token e; } { k = n = def() { saveComment( k.specialToken ); x = getComment(); s = i.addStruct( n, opts ); } params( s ) ( e = ref() { s.setExtends( new Name( e, e.image ) ); } )? ( )? { structComment( s, x ); } } void extern_stmt( Service i, Map opts ) : { Name n; } { n = def() { i.addExtern( n, opts ); } ( )? } void exception_stmt( Service i, Map opts ) : { Token k; Name n; Except s; Token x; Token e; } { k = n = def() { saveComment( k.specialToken ); x = getComment(); s = i.addExcept( n, opts ); } params( s ) ( e = ref() { s.setExtends( new Name( e, e.image ) ); } )? ( )? { exceptComment( s, x ); } } void message_stmt( Service i, Map opts ) : { TypeRef rt; Name n; Message m; Token k; } { rt = rtype() n = def() { saveComment( rt.type().specialToken ); k = getComment(); m = i.addMessage( n, opts, rt ); } params( m ) ( throws_list( m ) )? ( )? { messageComment( m, k ); } } void throws_list( Message m ) : { Token n; Thrown t; } { n = ref() { t = m.addThrown( new Name( n, n.image ) ); thrownComment( t, n.specialToken ); } ( n = ref() { t = m.addThrown( new Name( n, n.image ) ); thrownComment( t, n.specialToken ); } )* } Token id() : { Token t; } { t = { return t; } } Token qid() : { Token t; } { t = { return t; } } Token xid() : { Token t; } { ( t = qid() | t = id() ) { return t; } } Name def() : { Token t; } { t = id() { return new Name( t, t.image ); } } Token ref() : { Token t; } { t = xid() { return t; } } TypeRef ctype() : { Token t; } { ( t = | t = | t = | t = | t = | t = | t = | t = ) { return new TypeRef( t ); } } TypeRef ptype() : { TypeRef tr; Token t; } { ( tr = ctype() | t = { tr = new TypeRef( t ); } | t = ref() { tr = new TypeRef( t ); } ) { return tr; } } TypeRef rtype() : { TypeRef tr; Token t; int d; } { ( ( tr = ptype() d = dim() { tr.setDim( d ); } ) | t = { tr = new TypeRef( t ); } ) { return tr; } } int dim() : { int d = 0; } { ( { d++; } )* { return d; } } void params( ParamList pl ) : {} { ( param( pl ) ( param( pl ) )* )? } void param( ParamList pl ) : { TypeRef tr; int d; Name n; } { tr = ptype() d = dim() n = def() { tr.setDim( d ); Parameter p = pl.addParameter( n, tr ); parameterComment( p, tr.type().specialToken ); } }