KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > antlr > LexerGrammar


1 package antlr;
2
3 /* ANTLR Translator Generator
4  * Project led by Terence Parr at http://www.jGuru.com
5  * Software rights: http://www.antlr.org/RIGHTS.html
6  *
7  * $Id: //depot/code/org.antlr/main/main/antlr/LexerGrammar.java#6 $
8  */

9
10 import java.util.Hashtable JavaDoc;
11 import java.util.Enumeration JavaDoc;
12 import java.io.IOException JavaDoc;
13
14 import antlr.collections.impl.BitSet;
15 import antlr.collections.impl.Vector;
16
17 /** Lexer-specific grammar subclass */
18 class LexerGrammar extends Grammar {
19     // character set used by lexer
20
protected BitSet charVocabulary;
21     // true if the lexer generates literal testing code for nextToken
22
protected boolean testLiterals = true;
23     // true if the lexer generates case-sensitive LA(k) testing
24
protected boolean caseSensitiveLiterals = true;
25     /** true if the lexer generates case-sensitive literals testing */
26     protected boolean caseSensitive = true;
27     /** true if lexer is to ignore all unrecognized tokens */
28     protected boolean filterMode = false;
29
30     /** if filterMode is true, then filterRule can indicate an optional
31      * rule to use as the scarf language. If null, programmer used
32      * plain "filter=true" not "filter=rule".
33      */

34     protected String JavaDoc filterRule = null;
35
36     LexerGrammar(String JavaDoc className_, Tool tool_, String JavaDoc superClass) {
37         super(className_, tool_, superClass);
38         charVocabulary = new BitSet();
39
40         // Lexer usually has no default error handling
41
defaultErrorHandler = false;
42     }
43
44     /** Top-level call to generate the code */
45     public void generate() throws IOException JavaDoc {
46         generator.gen(this);
47     }
48
49     public String JavaDoc getSuperClass() {
50         // If debugging, use debugger version of scanner
51
if (debuggingOutput)
52             return "debug.DebuggingCharScanner";
53         return "CharScanner";
54     }
55
56     // Get the testLiterals option value
57
public boolean getTestLiterals() {
58         return testLiterals;
59     }
60
61     /**Process command line arguments.
62      * -trace have all rules call traceIn/traceOut
63      * -traceLexer have lexical rules call traceIn/traceOut
64      * -debug generate debugging output for parser debugger
65      */

66     public void processArguments(String JavaDoc[] args) {
67         for (int i = 0; i < args.length; i++) {
68             if (args[i].equals("-trace")) {
69                 traceRules = true;
70                 antlrTool.setArgOK(i);
71             }
72             else if (args[i].equals("-traceLexer")) {
73                 traceRules = true;
74                 antlrTool.setArgOK(i);
75             }
76             else if (args[i].equals("-debug")) {
77                 debuggingOutput = true;
78                 antlrTool.setArgOK(i);
79             }
80         }
81     }
82
83     /** Set the character vocabulary used by the lexer */
84     public void setCharVocabulary(BitSet b) {
85         charVocabulary = b;
86     }
87
88     /** Set lexer options */
89     public boolean setOption(String JavaDoc key, Token value) {
90         String JavaDoc s = value.getText();
91         if (key.equals("buildAST")) {
92             antlrTool.warning("buildAST option is not valid for lexer", getFilename(), value.getLine(), value.getColumn());
93             return true;
94         }
95         if (key.equals("testLiterals")) {
96             if (s.equals("true")) {
97                 testLiterals = true;
98             }
99             else if (s.equals("false")) {
100                 testLiterals = false;
101             }
102             else {
103                 antlrTool.warning("testLiterals option must be true or false", getFilename(), value.getLine(), value.getColumn());
104             }
105             return true;
106         }
107         if (key.equals("interactive")) {
108             if (s.equals("true")) {
109                 interactive = true;
110             }
111             else if (s.equals("false")) {
112                 interactive = false;
113             }
114             else {
115                 antlrTool.error("interactive option must be true or false", getFilename(), value.getLine(), value.getColumn());
116             }
117             return true;
118         }
119         if (key.equals("caseSensitive")) {
120             if (s.equals("true")) {
121                 caseSensitive = true;
122             }
123             else if (s.equals("false")) {
124                 caseSensitive = false;
125             }
126             else {
127                 antlrTool.warning("caseSensitive option must be true or false", getFilename(), value.getLine(), value.getColumn());
128             }
129             return true;
130         }
131         if (key.equals("caseSensitiveLiterals")) {
132             if (s.equals("true")) {
133                 caseSensitiveLiterals = true;
134             }
135             else if (s.equals("false")) {
136                 caseSensitiveLiterals = false;
137             }
138             else {
139                 antlrTool.warning("caseSensitiveLiterals option must be true or false", getFilename(), value.getLine(), value.getColumn());
140             }
141             return true;
142         }
143         if (key.equals("filter")) {
144             if (s.equals("true")) {
145                 filterMode = true;
146             }
147             else if (s.equals("false")) {
148                 filterMode = false;
149             }
150             else if (value.getType() == ANTLRTokenTypes.TOKEN_REF) {
151                 filterMode = true;
152                 filterRule = s;
153             }
154             else {
155                 antlrTool.warning("filter option must be true, false, or a lexer rule name", getFilename(), value.getLine(), value.getColumn());
156             }
157             return true;
158         }
159         if (key.equals("longestPossible")) {
160             antlrTool.warning("longestPossible option has been deprecated; ignoring it...", getFilename(), value.getLine(), value.getColumn());
161             return true;
162         }
163         if (super.setOption(key, value)) {
164             return true;
165         }
166         antlrTool.error("Invalid option: " + key, getFilename(), value.getLine(), value.getColumn());
167         return false;
168     }
169 }
170
Popular Tags