check point for arrays as Lists and new data types
[lwes-java.git] / src / main / javacc / ESFParser.jj
blob6e5bc90a0bacfb8c00715b3c223831979293b0aa
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.apache.commons.logging.Log;
13 import org.apache.commons.logging.LogFactory;
15 public class ESFParser
18     private static transient Log log = LogFactory.getLog(ESFParser.class);
20   private String currentEvent;
21   private EventTemplateDB eventTemplateDB;
23   public void setEventTemplateDB(EventTemplateDB DB)
24     { eventTemplateDB = DB; }
26   public EventTemplateDB getEventTemplateDB()
27     { return eventTemplateDB; }
29   public void setCurrentEvent(String evt)
30     { currentEvent = evt; }
32   public String getCurrentEvent()
33     { return currentEvent; }
35   public String removeQuotes(String str) {
36     return str.replace("\"","");
37   }
40 PARSER_END(ESFParser)
42 SKIP :
44   " "
45 | "\t"
46 | "\n"
47 | "\r"
48 | "#" : IN_LINE_COMMENT
51 <IN_LINE_COMMENT> SKIP:
53    "\n" : DEFAULT
54 |  "\r" : DEFAULT
55 |  "\r\n" : DEFAULT
58 <IN_LINE_COMMENT> MORE:
60   < ~[] >
64 TOKEN :
66     < REQ: "required" >
67   | < OPT: "optional" >
68   | < TRUE: "true" >
69   | < FALSE: "false" >
70   | < LBRACKET: "[" >
71   | < RBRACKET: "]" >
72   | < INTEGER_LITERAL: ["1"-"9"] (["0"-"9"])* >
73   | < STRING_LITERAL: "\""(<ID>)"\"" >
74   | < DOUBLE_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* >
75   | < ID: ["a"-"z","A"-"Z","_",":","0"-"9","."] (["a"-"z","A"-"Z","_",":","0"-"9","."])* >
79 /**
80  * A list of events
81  */
82 void eventlist() :
86   event() ( event() )* <EOF>
89 /**
90  * a single event
91  */
92 void event() :
96   eventName() "{" [ attributeList() ] "}"
99 /**
100  * The name of an event, should be max 256 chars ([a-zA-Z0-9_]*)
101  */
102 void eventName() :
104   Token t;
107   t=<ID>
108   {
109     if ( getEventTemplateDB().addEvent(t.image))
110     {
111       setCurrentEvent(t.image);
112     }
113     else
114     {
115       throw new ParseException("Problem adding event "+t.image);
116     }
117   }
120 void attributeList() :
123   attribute() ( attribute() )*
126 String stringLiteral() :
128     Token t;
131     t = <STRING_LITERAL>
132     {
133        return removeQuotes(t.image);
134     }
137 boolean booleanLiteral() :
140   <TRUE>
141   {
142     return true;
143   }
144   |
145   <FALSE>
146   {
147     return false;
148   }
151 int integerLiteral() :
153     Token t;
156   t = <INTEGER_LITERAL>
157   {
158     try {
159       return Integer.parseInt(t.image);
160     } catch (NumberFormatException e) {
161       throw new Error();
162     }
163   }
166 double doubleLiteral() :
168     Token t;
171     t = <DOUBLE_LITERAL>
172     {
173        try {
174          return Double.parseDouble(t.image);
175        } catch (NumberFormatException e) {
176          throw new Error();
177        }
178     }
181 Object defaultValue() :
183     Object obj;
186     obj = integerLiteral()
187     {
188       return obj;
189     }
190     | obj = doubleLiteral()
191     {
192       return obj;
193     }
194     | obj = booleanLiteral()
195     {
196       return obj;
197     }
198     | obj = stringLiteral()
199     {
200       return obj;
201     }
204 boolean required() :
208     <REQ>
209     {
210       return true;
211     }
212     | <OPT>
213     {
214       return false;
215     }
218 void attribute() :
220   String aType;
221   String anAttribute;
222   int anArraySize = 0;
223   boolean required = false;
224   Object aDefaultValue = null;
227   (((required = required()) (aType=type() anAttribute=attributeName() [ "[" anArraySize = integerLiteral() "]" ] [ "=" aDefaultValue = defaultValue() ] ";"))
229   (aType=type() anAttribute=attributeName() [ "[" anArraySize = integerLiteral() "]" ] [ "=" aDefaultValue = defaultValue() ] ";")  ) {
230       if ( !( aType.equals("uint16")  ||
231               aType.equals("int16")   ||
232               aType.equals("uint32")  ||
233               aType.equals("int32")   ||
234               aType.equals("string")  ||
235               aType.equals("ip_addr") ||
236               aType.equals("int64")   ||
237               aType.equals("uint64")  ||
238               aType.equals("byte")    ||
239               aType.equals("double")  ||
240               aType.equals("float")   ||
241               aType.equals("ipv4")    ||
242               aType.equals("boolean")
243             )
244          )
245        {
246          throw new ParseException("No such type '"+aType+"'");
247        }
249       String evt = getCurrentEvent();
250       if ( evt == null ) throw new ParseException("Bad Event");
252       if (log.isTraceEnabled()) {
253         log.trace("Type: "+aType+" attr: "+anAttribute+" size: "+anArraySize);
254         log.trace("Required: "+required);
255         log.trace("default value: "+aDefaultValue);
256       }
258       if (anArraySize > 0) {
259         aType = "[L"+aType;
260       }
262       if ( !getEventTemplateDB().addEventAttribute(evt,
263                                                    anAttribute,
264                                                    aType,
265                                                    anArraySize,
266                                                    required,
267                                                    aDefaultValue))
268       {
269         throw new ParseException("Problem adding attribute "+evt+"("
270                                  +aType+","+anAttribute+")");
271       }
272    }
275 String type() :
277   Token t;
280   t=<ID>
281   {
282     return t.image;
283   }
286 String attributeName() :
288   Token t;
291   t=<ID>
292   {
293     return t.image;
294   }