/*******************************************************************************
* Copyright (c) 2008 Scott Stanchfield.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Based on the ANTLR parser generator by Terence Parr, http://antlr.org
* Ric Klaren <klaren@cs.utwente.nl>
* Scott Stanchfield - Modifications for XML Parsing
*******************************************************************************/
package com.javadude.antxr;
import java.io.IOException;
import com.javadude.antxr.collections.impl.BitSet;
/** Lexer-specific grammar subclass */
class LexerGrammar extends Grammar {
// character set used by lexer
protected BitSet charVocabulary;
// true if the lexer generates literal testing code for nextToken
protected boolean testLiterals = true;
// true if the lexer generates case-sensitive LA(k) testing
protected boolean caseSensitiveLiterals = true;
/** true if the lexer generates case-sensitive literals testing */
protected boolean caseSensitive = true;
/** true if lexer is to ignore all unrecognized tokens */
protected boolean filterMode = false;
/** if filterMode is true, then filterRule can indicate an optional
* rule to use as the scarf language. If null, programmer used
* plain "filter=true" not "filter=rule".
*/
protected String filterRule = null;
LexerGrammar(String className_, Tool tool_, String superClass) {
super(className_, tool_, superClass);
// by default, use 0..127 for ASCII char vocabulary
BitSet cv = new BitSet();
for (int i = 0; i <= 127; i++) {
cv.add(i);
}
setCharVocabulary(cv);
// Lexer usually has no default error handling
defaultErrorHandler = false;
}
/** Top-level call to generate the code */
@Override
public void generate() throws IOException {
generator.gen(this);
}
@Override
public String getSuperClass() {
// If debugging, use debugger version of scanner
if (debuggingOutput) {
return "debug.DebuggingCharScanner";
}
return "CharScanner";
}
// Get the testLiterals option value
public boolean getTestLiterals() {
return testLiterals;
}
/**Process command line arguments.
* -trace have all rules call traceIn/traceOut
* -traceLexer have lexical rules call traceIn/traceOut
* -debug generate debugging output for parser debugger
*/
@Override
public void processArguments(String[] args) {
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-trace")) {
traceRules = true;
antxrTool.setArgOK(i);
}
else if (args[i].equals("-traceLexer")) {
traceRules = true;
antxrTool.setArgOK(i);
}
else if (args[i].equals("-debug")) {
debuggingOutput = true;
antxrTool.setArgOK(i);
}
}
}
/** Set the character vocabulary used by the lexer */
public void setCharVocabulary(BitSet b) {
charVocabulary = b;
}
/** Set lexer options */
@Override
public boolean setOption(String key, Token value) {
String s = value.getText();
if (key.equals("buildAST")) {
antxrTool.warning("buildAST option is not valid for lexer", getFilename(), value.getLine(), value.getColumn());
return true;
}
if (key.equals("testLiterals")) {
if (s.equals("true")) {
testLiterals = true;
}
else if (s.equals("false")) {
testLiterals = false;
}
else {
antxrTool.warning("testLiterals option must be true or false", getFilename(), value.getLine(), value.getColumn());
}
return true;
}
if (key.equals("interactive")) {
if (s.equals("true")) {
interactive = true;
}
else if (s.equals("false")) {
interactive = false;
}
else {
antxrTool.error("interactive option must be true or false", getFilename(), value.getLine(), value.getColumn());
}
return true;
}
if (key.equals("caseSensitive")) {
if (s.equals("true")) {
caseSensitive = true;
}
else if (s.equals("false")) {
caseSensitive = false;
}
else {
antxrTool.warning("caseSensitive option must be true or false", getFilename(), value.getLine(), value.getColumn());
}
return true;
}
if (key.equals("caseSensitiveLiterals")) {
if (s.equals("true")) {
caseSensitiveLiterals = true;
}
else if (s.equals("false")) {
caseSensitiveLiterals = false;
}
else {
antxrTool.warning("caseSensitiveLiterals option must be true or false", getFilename(), value.getLine(), value.getColumn());
}
return true;
}
if (key.equals("filter")) {
if (s.equals("true")) {
filterMode = true;
}
else if (s.equals("false")) {
filterMode = false;
}
else if (value.getType() == ANTXRTokenTypes.TOKEN_REF) {
filterMode = true;
filterRule = s;
}
else {
antxrTool.warning("filter option must be true, false, or a lexer rule name", getFilename(), value.getLine(), value.getColumn());
}
return true;
}
if (key.equals("longestPossible")) {
antxrTool.warning("longestPossible option has been deprecated; ignoring it...", getFilename(), value.getLine(), value.getColumn());
return true;
}
if (key.equals("className")) {
super.setOption(key, value);
return true;
}
if (super.setOption(key, value)) {
return true;
}
antxrTool.error("Invalid option: " + key, getFilename(), value.getLine(), value.getColumn());
return false;
}
}