string, numeric and boolean literals all work
[lwes-java.git] / src / main / javacc / ESFParser.jj
blobec7f6828584617c7d9d3964769a4675f3651054d
1 options {
2   DEBUG_PARSER=false;
3   DEBUG_LOOKAHEAD=false;
4   DEBUG_TOKEN_MANAGER=false;
5   STATIC=false;
8 PARSER_BEGIN(ESFParser)
10 package org.lwes.db;
12 import org.lwes.util.Log;
14 public class ESFParser
16   private String currentEvent;
17   private EventTemplateDB eventTemplateDB;
19   public void setEventTemplateDB(EventTemplateDB DB)
20     { eventTemplateDB = DB; }
22   public EventTemplateDB getEventTemplateDB()
23     { return eventTemplateDB; }
25   public void setCurrentEvent(String evt)
26     { currentEvent = evt; }
28   public String getCurrentEvent()
29     { return currentEvent; }
32 PARSER_END(ESFParser)
34 SKIP :
36   " "
37 | "\t"
38 | "\n"
39 | "\r"
40 | "#" : IN_LINE_COMMENT
43 <IN_LINE_COMMENT> SKIP:
45    "\n" : DEFAULT
46 |  "\r" : DEFAULT
47 |  "\r\n" : DEFAULT
50 <IN_LINE_COMMENT> MORE:
52   < ~[] >
56 TOKEN :
58     < REQ: "required" >
59   | < OPT: "optional" >
60   | < TRUE: "true" >
61   | < FALSE: "false" >
62   | < ID: ["a"-"z","A"-"Z","_",":","0"-"9","."] (["a"-"z","A"-"Z","_",":","0"-"9","."])* >
63   | < LBRACKET: "[" >
64   | < RBRACKET: "]" >
65   | < INTEGER_LITERAL: ["1"-"9"] (["0"-"9"])* >
66   | < STRING_LITERAL: "\""(<ID>)"\"" >
70 /**
71  * A list of events
72  */
73 void eventlist() :
77   event() ( event() )* <EOF>
80 /**
81  * a single event
82  */
83 void event() :
87   eventName() "{" [ attributeList() ] "}"
90 /**
91  * The name of an event, should be max 256 chars ([a-zA-Z0-9_]*)
92  */
93 void eventName() :
95   Token t;
98   t=<ID>
99   {
100     if ( getEventTemplateDB().addEvent(t.image))
101     {
102       setCurrentEvent(t.image);
103     }
104     else
105     {
106       throw new ParseException("Problem adding event "+t.image);
107     }
108   }
111 void attributeList() :
114   attribute() ( attribute() )*
117 int arraySize() :
119   Token t;
122     t = <ID>
123     {
124     return Integer.parseInt(t.image);
125     }
128 String StringLiteral() :
130     Token t;
133     t = <STRING_LITERAL>
134     {
135        return t.image;
136     }
139 boolean BooleanLiteral() :
142   <TRUE>
143   {
144     return true;
145   }
146   |
147   <FALSE>
148   {
149     return false;
150   }
153 int IntegerLiteral() :
155     Token t;
158   t = <ID>
159   {
160   Log.debug("INTEGER LITERAL");
161     try {
162       return Integer.parseInt(t.image);
163     } catch (NumberFormatException e) {
164       throw new Error();
165     }
166   }
169 Object defaultValue() :
171     Object obj;
174     obj = IntegerLiteral()
175     {
176       return obj;
177     }
178     | obj = BooleanLiteral()
179     {
180       return obj;
181     }
182     | obj = StringLiteral()
183     {
184       return obj;
185     }
188 void attribute() :
190   String aType;
191   String anAttribute;
192   int anArraySize = 0;
193   boolean required = false;
194   Object aDefaultValue = null;
197   ((("required" {required = true;} | "optional") (aType=type() anAttribute=attributeName() [ "[" anArraySize = arraySize() "]" ] [ "=" aDefaultValue = defaultValue() ] ";"))
199   (aType=type() anAttribute=attributeName() [ "[" anArraySize = arraySize() "]" ] [ "=" aDefaultValue = defaultValue() ] ";")  ) {
200       if ( !( aType.equals("uint16")  ||
201               aType.equals("int16")   ||
202               aType.equals("uint32")  ||
203               aType.equals("int32")   ||
204               aType.equals("string")  ||
205               aType.equals("ip_addr") ||
206               aType.equals("int64")   ||
207               aType.equals("uint64")  ||
208               aType.equals("byte")    ||
209               aType.equals("boolean")
210             )
211          )
212        {
213          throw new ParseException("No such type '"+aType+"'");
214        }
216       String evt = getCurrentEvent();
217       if ( evt == null ) throw new ParseException("Bad Event");
219       if (Log.isLogTrace()) {
220         Log.trace("Type: "+aType+" attr: "+anAttribute+" size: "+anArraySize);
221         Log.trace("Required: "+required);
222         Log.trace("default value: "+aDefaultValue);
223       }
225       if (anArraySize > 0) {
226         aType = "[L"+aType;
227       }
229       if ( !getEventTemplateDB().addEventAttribute(evt,
230                                                    anAttribute,
231                                                    aType,
232                                                    anArraySize,
233                                                    required,
234                                                    aDefaultValue))
235       {
236         throw new ParseException("Problem adding attribute "+evt+"("
237                                  +aType+","+anAttribute+")");
238       }
239    }
242 String type() :
244   Token t;
247   t=<ID>
248   {
249     return t.image;
250   }
253 String attributeName() :
255   Token t;
258   t=<ID>
259   {
260     return t.image;
261   }