001: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
002: * This file is part of Beaver Parser Generator. *
003: * Copyright (C) 2003,2005 Alexander Demenchuk <alder@softanvil.com>. *
004: * All rights reserved. *
005: * See the file "LICENSE" for the terms and conditions for copying, *
006: * distribution and modification of Beaver. *
007: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
008:
009: package beaver.spec.parser;
010:
011: import beaver.comp.util.Log;
012: import beaver.*;
013: import beaver.spec.ast.*;
014: import java.util.ArrayList;
015:
016: /**
017: * This class is a LALR parser generated by
018: * <a href="http://beaver.sourceforge.net">Beaver</a> v0.9.6
019: * from the grammar specification "beaver.grammar".
020: */
021: public class GrammarParser extends Parser {
022: static public class Terminals {
023: static public final short EOF = 0;
024: static public final short IDENT = 1;
025: static public final short SEMI = 2;
026: static public final short TYPEOF = 3;
027: static public final short HEADER = 4;
028: static public final short PACKAGE = 5;
029: static public final short CLASS = 6;
030: static public final short EMBED = 7;
031: static public final short INIT = 8;
032: static public final short GOAL = 9;
033: static public final short IMPORT = 10;
034: static public final short TERMINALS = 11;
035: static public final short LEFT = 12;
036: static public final short RIGHT = 13;
037: static public final short NONASSOC = 14;
038: static public final short BAR = 15;
039: static public final short CODE = 16;
040: static public final short AT = 17;
041: static public final short COMMA = 18;
042: static public final short TEXT = 19;
043: static public final short IS = 20;
044: static public final short QUESTION = 21;
045: static public final short PLUS = 22;
046: static public final short STAR = 23;
047: static public final short DOT = 24;
048:
049: static public final String[] NAMES = { "EOF", "IDENT", "SEMI",
050: "TYPEOF", "HEADER", "PACKAGE", "CLASS", "EMBED",
051: "INIT", "GOAL", "IMPORT", "TERMINALS", "LEFT", "RIGHT",
052: "NONASSOC", "BAR", "CODE", "AT", "COMMA", "TEXT", "IS",
053: "QUESTION", "PLUS", "STAR", "DOT" };
054: }
055:
056: static final ParsingTables PARSING_TABLES = new ParsingTables(
057: "U9pLbqbmLKKKXlztBm42n8GGXinXa459a2Ga94moAGwe33AZKEMQXMkjOgrLhbsuTg5LbbM"
058: + "wK9T2GWX1a8G4XIX31iAKYKcG7B##xmP2h8wQqYfvV$rzJlT$Uhgtxkb#Kd10fVQRKhH9#$"
059: + "IQnjgFcgjvcgy5UaRFQg6ALQ95UawBKPxI7CrKe5BA5CtMqqhJ63laxV50eLvLkIhrlDRg1"
060: + "RsaQctLTktINljTaxtQWB9im8ExAh2x7jpHKhlZmMsjijiUtD8ok#N1JQsqcnxqQxNrUz2d"
061: + "bwtFWrvjiLuFUhJHUZperklMxS4DRROR7bndlkiUNDERTis3g$Ixwi4LxR0h7dJHhyk3ozf"
062: + "jbptef5#d1nrwopeyQ9UitOFpQESzQ4Dhy#0IsYKFBg9TzE02sWKF3CttEsx7DKjJxRJAbA"
063: + "abAjH4EsR7D45Jd0PEHuXyvJiDD5Y39YbRESgrUtPFwwpEwfJknd4QE6jdzMBirqL8ZXFvp"
064: + "3JUpKHyaugOgHdy38xQKQLQlTMhmfeYd8cqPerp6gYFS0ISiLghLPNLM8scMOkrQ8toh37I"
065: + "ZZWDr4HeYT1eZSgmKtRE3ckwjTe9hTSCEwaDzeFzfEKef#mmE6SdOAkTX2Xst#vBMc6$sA$"
066: + "QfftQexVrYjxGi5#aRugHJKE2NUOh2mJahLdahJbahiTpLheoo5dPMWopwL50ZnBAAc#F11"
067: + "akr1Zou5YDuoccygOcyYxIo989uDToHzbloYYr9V$1c2EjSoGjvtyqtnFIZwpnn6jyUK5SP"
068: + "lEbvIelgXMISzoNDpakfsgQfcj6N7CHnN6R#uepefQAg4n695kJ4NyU9vkueJCvg#WzkFx9"
069: + "rIJZ1stfOwCCZNDbMUnNFeptbK64yjWkZUtWV8wPb5bncGuKFR$C8P4HXXyIH3o2jFzWCkK"
070: + "jX3dHtfHe8wmFMmCVm6xO9GKyhM01CIdObN0rhAA#3Eku5j8$G4zy3nlmK#4ac0#Bu6pQM#"
071: + "cp7Tj1VIvSXty8EnvkHQk66#0s#0vy5xfbVWG$WP$1Rs0jR8ASfUfX35SVm7x7E6bOvjKM$"
072: + "9duRc$xyTVZpyT$7v$n0zQX3x7pQA#0pVYhi6vDdCF16kncOZx7tuE$3$zRdaylrgrvBsq7"
073: + "y3dh0zOThC172tRG$Xva7S5Ex0UGPnVimduCMKUm6$if$DfjZZ4xuO1x1mVZ3UEs3$6$ZEr"
074: + "NnFKCjWydlqLnN3zpJF35ZKIDei$V77VZlpJE5t#XTppo4y4Gls28Npryp$oMSuOdOC0vBk"
075: + "ZEQCU0SppWH4$yGxhxGiZv7t832Ba3XDm2Gku18JU1a9j0o5qWv3OGyWM6t0rIE6kJvsrEd"
076: + "DCBo8W5qJ#c10oZB5H4FO$rkSnKZ2t6bc1Bi8N456BBgBjyKuujZ#yCbL4kIJnaXSkcVm2p"
077: + "BaPq");
078:
079: static class Events extends Parser.Events {
080: private final Log log;
081:
082: Events(Log log) {
083: this .log = log;
084: }
085:
086: public void scannerError(Scanner.Exception e) {
087: log.error(e);
088: }
089:
090: public void syntaxError(Symbol token) {
091: log.error(token, "unexpected token");
092: }
093:
094: public void unexpectedTokenRemoved(Symbol token) {
095: log
096: .warning(token,
097: "recovered by removing unexpected token");
098: }
099:
100: public void missingTokenInserted(Symbol token) {
101: log.warning(token, "recovered by inserting missing '"
102: + Terminals.NAMES[token.getId()] + "'");
103: }
104:
105: public void misspelledTokenReplaced(Symbol token) {
106: log.warning(token,
107: "recovered by replacing misspelled token with '"
108: + Terminals.NAMES[token.getId()] + "'");
109: }
110:
111: public void errorPhraseRemoved(Symbol error) {
112: log.warning(error, "recovered by removing error phrase");
113: }
114: }
115:
116: private Log log;
117:
118: public GrammarParser(Log log) {
119: this ();
120: report = new Events(this .log = log);
121: }
122:
123: public GrammarParser() {
124: super (PARSING_TABLES);
125: }
126:
127: protected Symbol invokeReduceAction(int rule_num, int offset) {
128: switch (rule_num) {
129: case 0: // lst$declaration = declaration
130: {
131: ArrayList lst = new ArrayList();
132: lst.add(_symbols[offset + 1].value);
133: return new Symbol(lst);
134: }
135: case 1: // lst$declaration = lst$declaration declaration
136: {
137: ((ArrayList) _symbols[offset + 1].value)
138: .add(_symbols[offset + 2].value);
139: return _symbols[offset + 1];
140: }
141: case 4: // lst$rule = rule
142: {
143: ArrayList lst = new ArrayList();
144: lst.add(_symbols[offset + 1].value);
145: return new Symbol(lst);
146: }
147: case 5: // lst$rule = lst$rule rule
148: {
149: ((ArrayList) _symbols[offset + 1].value)
150: .add(_symbols[offset + 2].value);
151: return _symbols[offset + 1];
152: }
153: case 6: // grammar = opt$lst$declaration.decl lst$rule.rules
154: {
155: final Symbol _symbol_decl = _symbols[offset + 1];
156: final ArrayList _list_decl = (ArrayList) _symbol_decl.value;
157: final Declaration[] decl = _list_decl == null ? new Declaration[0]
158: : (Declaration[]) _list_decl
159: .toArray(new Declaration[_list_decl.size()]);
160: final Symbol _symbol_rules = _symbols[offset + 2];
161: final ArrayList _list_rules = (ArrayList) _symbol_rules.value;
162: final Rule[] rules = _list_rules == null ? new Rule[0]
163: : (Rule[]) _list_rules.toArray(new Rule[_list_rules
164: .size()]);
165:
166: return new GrammarTreeRoot(decl, rules);
167: }
168: case 19: // declaration = error.e SEMI
169: {
170: final Symbol e = _symbols[offset + 1];
171:
172: log.error(e, "malformed declaration");
173: return new Declaration.Error();
174: }
175: case 20: // header = HEADER CODE.code SEMI
176: {
177: final Symbol code = _symbols[offset + 2];
178:
179: return new Declaration.Header(code);
180: }
181: case 21: // package = PACKAGE TEXT.name SEMI
182: {
183: final Symbol name = _symbols[offset + 2];
184:
185: return new Declaration.PackageName(name);
186: }
187: case 22: // import = IMPORT txt_list.names SEMI
188: {
189: final Symbol _symbol_names = _symbols[offset + 2];
190: final ArrayList _list_names = (ArrayList) _symbol_names.value;
191: final beaver.Symbol[] names = _list_names == null ? new beaver.Symbol[0]
192: : (beaver.Symbol[]) _list_names
193: .toArray(new beaver.Symbol[_list_names
194: .size()]);
195:
196: return new Declaration.Imports(names);
197: }
198: case 23: // class_name = CLASS TEXT.name SEMI
199: {
200: final Symbol name = _symbols[offset + 2];
201:
202: return new Declaration.ClassName(name);
203: }
204: case 24: // class_code = EMBED CODE.code SEMI
205: {
206: final Symbol code = _symbols[offset + 2];
207:
208: return new Declaration.ClassCode(code);
209: }
210: case 25: // class_init = INIT CODE.code SEMI
211: {
212: final Symbol code = _symbols[offset + 2];
213:
214: return new Declaration.ConstructorCode(code);
215: }
216: case 26: // grammar_goal = GOAL IDENT.name SEMI
217: {
218: final Symbol name = _symbols[offset + 2];
219:
220: return new Declaration.Goal(name);
221: }
222: case 27: // terminals = TERMINALS sym_list.symbols SEMI
223: {
224: final Symbol _symbol_symbols = _symbols[offset + 2];
225: final ArrayList _list_symbols = (ArrayList) _symbol_symbols.value;
226: final beaver.Symbol[] symbols = _list_symbols == null ? new beaver.Symbol[0]
227: : (beaver.Symbol[]) _list_symbols
228: .toArray(new beaver.Symbol[_list_symbols
229: .size()]);
230:
231: return new Declaration.Terminals(symbols);
232: }
233: case 28: // left_assoc = LEFT sym_list.symbols SEMI
234: {
235: final Symbol _symbol_symbols = _symbols[offset + 2];
236: final ArrayList _list_symbols = (ArrayList) _symbol_symbols.value;
237: final beaver.Symbol[] symbols = _list_symbols == null ? new beaver.Symbol[0]
238: : (beaver.Symbol[]) _list_symbols
239: .toArray(new beaver.Symbol[_list_symbols
240: .size()]);
241:
242: return new Declaration.LeftAssoc(symbols);
243: }
244: case 29: // right_assoc = RIGHT sym_list.symbols SEMI
245: {
246: final Symbol _symbol_symbols = _symbols[offset + 2];
247: final ArrayList _list_symbols = (ArrayList) _symbol_symbols.value;
248: final beaver.Symbol[] symbols = _list_symbols == null ? new beaver.Symbol[0]
249: : (beaver.Symbol[]) _list_symbols
250: .toArray(new beaver.Symbol[_list_symbols
251: .size()]);
252:
253: return new Declaration.RightAssoc(symbols);
254: }
255: case 30: // nonassoc = NONASSOC sym_list.symbols SEMI
256: {
257: final Symbol _symbol_symbols = _symbols[offset + 2];
258: final ArrayList _list_symbols = (ArrayList) _symbol_symbols.value;
259: final beaver.Symbol[] symbols = _list_symbols == null ? new beaver.Symbol[0]
260: : (beaver.Symbol[]) _list_symbols
261: .toArray(new beaver.Symbol[_list_symbols
262: .size()]);
263:
264: return new Declaration.NonAssoc(symbols);
265: }
266: case 31: // typeof = TYPEOF sym_list.symbols IS TEXT.type SEMI
267: {
268: final Symbol _symbol_symbols = _symbols[offset + 2];
269: final ArrayList _list_symbols = (ArrayList) _symbol_symbols.value;
270: final beaver.Symbol[] symbols = _list_symbols == null ? new beaver.Symbol[0]
271: : (beaver.Symbol[]) _list_symbols
272: .toArray(new beaver.Symbol[_list_symbols
273: .size()]);
274: final Symbol type = _symbols[offset + 4];
275:
276: return new Declaration.TypeOf(symbols, type);
277: }
278: case 32: // txt_list = TEXT
279: {
280: ArrayList lst = new ArrayList();
281: lst.add(_symbols[offset + 1]);
282: return new Symbol(lst);
283: }
284: case 33: // txt_list = txt_list COMMA TEXT
285: {
286: ((ArrayList) _symbols[offset + 1].value)
287: .add(_symbols[offset + 3]);
288: return _symbols[offset + 1];
289: }
290: case 34: // sym_list = IDENT
291: {
292: ArrayList lst = new ArrayList();
293: lst.add(_symbols[offset + 1]);
294: return new Symbol(lst);
295: }
296: case 35: // sym_list = sym_list COMMA IDENT
297: {
298: ((ArrayList) _symbols[offset + 1].value)
299: .add(_symbols[offset + 3]);
300: return _symbols[offset + 1];
301: }
302: case 36: // rule = IDENT.name IS def_list.defs SEMI
303: {
304: final Symbol name = _symbols[offset + 1];
305: final Symbol _symbol_defs = _symbols[offset + 3];
306: final ArrayList _list_defs = (ArrayList) _symbol_defs.value;
307: final Rule.Definition[] defs = _list_defs == null ? new Rule.Definition[0]
308: : (Rule.Definition[]) _list_defs
309: .toArray(new Rule.Definition[_list_defs
310: .size()]);
311:
312: return new Rule(name, defs);
313: }
314: case 37: // rule = error.e SEMI
315: {
316: final Symbol e = _symbols[offset + 1];
317:
318: log.error(e, "malformed production");
319: return new Rule(new Symbol(""), new Rule.Definition[] {});
320: }
321: case 38: // def_list = definition
322: {
323: ArrayList lst = new ArrayList();
324: lst.add(_symbols[offset + 1].value);
325: return new Symbol(lst);
326: }
327: case 39: // def_list = def_list BAR definition
328: {
329: ((ArrayList) _symbols[offset + 1].value)
330: .add(_symbols[offset + 3].value);
331: return _symbols[offset + 1];
332: }
333: case 40: // lst$def_element = def_element
334: {
335: ArrayList lst = new ArrayList();
336: lst.add(_symbols[offset + 1].value);
337: return new Symbol(lst);
338: }
339: case 41: // lst$def_element = lst$def_element def_element
340: {
341: ((ArrayList) _symbols[offset + 1].value)
342: .add(_symbols[offset + 2].value);
343: return _symbols[offset + 1];
344: }
345: case 48: // definition = opt$lst$def_element.elts opt$rule_precedence.prec opt$CODE.code
346: {
347: final Symbol _symbol_elts = _symbols[offset + 1];
348: final ArrayList _list_elts = (ArrayList) _symbol_elts.value;
349: final Rule.Definition.Element[] elts = _list_elts == null ? new Rule.Definition.Element[0]
350: : (Rule.Definition.Element[]) _list_elts
351: .toArray(new Rule.Definition.Element[_list_elts
352: .size()]);
353: final Symbol prec = _symbols[offset + 2];
354: final Symbol code = _symbols[offset + 3];
355:
356: return new Rule.Definition(elts, prec, code);
357: }
358: case 49: // definition = error.e
359: {
360: final Symbol e = _symbols[offset + 1];
361:
362: log.error(e, "malformed nonterminal definition");
363: return new Rule.Definition(null, new Symbol(null),
364: new Symbol(null));
365: }
366: case 54: // def_element = IDENT.name opt$alias.alias opt$ebnf_symbol.ebnf_mark
367: {
368: final Symbol name = _symbols[offset + 1];
369: final Symbol alias = _symbols[offset + 2];
370: final Symbol ebnf_mark = _symbols[offset + 3];
371:
372: return new Rule.Definition.Element(name, alias, ebnf_mark);
373: }
374: case 2: // opt$lst$declaration =
375: case 42: // opt$lst$def_element =
376: case 44: // opt$rule_precedence =
377: case 46: // opt$CODE =
378: case 50: // opt$alias =
379: case 52: // opt$ebnf_symbol =
380: {
381: return new Symbol(null);
382: }
383: case 3: // opt$lst$declaration = lst$declaration
384: case 7: // declaration = header
385: case 8: // declaration = package
386: case 9: // declaration = import
387: case 10: // declaration = class_name
388: case 11: // declaration = class_code
389: case 12: // declaration = class_init
390: case 13: // declaration = grammar_goal
391: case 14: // declaration = typeof
392: case 15: // declaration = terminals
393: case 16: // declaration = left_assoc
394: case 17: // declaration = right_assoc
395: case 18: // declaration = nonassoc
396: case 43: // opt$lst$def_element = lst$def_element
397: case 45: // opt$rule_precedence = rule_precedence
398: case 47: // opt$CODE = CODE
399: case 51: // opt$alias = alias
400: case 53: // opt$ebnf_symbol = ebnf_symbol
401: case 56: // ebnf_symbol = QUESTION
402: case 57: // ebnf_symbol = PLUS
403: case 58: // ebnf_symbol = STAR
404: {
405: return _symbols[offset + 1];
406: }
407: case 55: // alias = DOT IDENT
408: case 59: // rule_precedence = AT IDENT
409: {
410: return _symbols[offset + 2];
411: }
412: default:
413: throw new IllegalArgumentException("unknown production #"
414: + rule_num);
415: }
416: }
417: }
|