Initial commit, Parser and abstract syntax tree skeleton done.
This commit is contained in:
commit
577ffcdcb3
28
build-common-versioning.xml
Normal file
28
build-common-versioning.xml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project name="Common Build Versioning" >
|
||||||
|
<property name="cbv-basedir" value="nbproject" />
|
||||||
|
|
||||||
|
<target name="-cbv-init">
|
||||||
|
<property file="${cbv-basedir}/project.versioning.properties" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="-pre-set-version" />
|
||||||
|
<target name="-do-set-version">
|
||||||
|
<input message="Current version is ${application.version}. Enter new version: " addproperty="new-version"/>
|
||||||
|
<propertyfile file="${cbv-basedir}/project.versioning.properties">
|
||||||
|
<entry key="application.version" value="${new-version}" />
|
||||||
|
<entry key="build.number" value="0" />
|
||||||
|
</propertyfile>
|
||||||
|
<property file="${cbv-basedir}/project.versioning.properties" />
|
||||||
|
</target>
|
||||||
|
<target name="-post-set-version" />
|
||||||
|
<target name="set-version" depends="-cbv-init,-pre-set-version,-do-set-version,-post-set-version"/>
|
||||||
|
|
||||||
|
<target name="increment-build-number">
|
||||||
|
<propertyfile file="${cbv-basedir}/project.versioning.properties">
|
||||||
|
<entry key="build.number" operation="+" type="int" default="0"/>
|
||||||
|
</propertyfile>
|
||||||
|
<property file="${cbv-basedir}/project.versioning.properties" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
</project>
|
49
build.xml
Normal file
49
build.xml
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<project name="Gammon-Bernard Common Lisp" default="dist" basedir=".">
|
||||||
|
<property file="project.properties"/>
|
||||||
|
<import file="build-common-versioning.xml"/>
|
||||||
|
|
||||||
|
<!-- This path represents all compile-time dependancies -->
|
||||||
|
<path id="javac.path">
|
||||||
|
<fileset dir="${lib.dir}">
|
||||||
|
<include name="**/*.jar"/>
|
||||||
|
</fileset>
|
||||||
|
</path>
|
||||||
|
|
||||||
|
<!-- This path represents all run-time dependancies -->
|
||||||
|
<path id="java.path">
|
||||||
|
<path refid="javac.path"/>
|
||||||
|
<pathelement path="${build.dir}"/>
|
||||||
|
</path>
|
||||||
|
|
||||||
|
<target name="init">
|
||||||
|
<tstamp/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="clean" depends="init">
|
||||||
|
<delete dir="${build.dir}"/>
|
||||||
|
<delete dir="${grammar.output.dir}"/>
|
||||||
|
<delete dir="${dist.dir}"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="compile-parser" depends="init">
|
||||||
|
<mkdir dir="${grammar.output.dir}"/>
|
||||||
|
<javacc
|
||||||
|
target="${grammar.file}"
|
||||||
|
javacchome="/usr/share/java"
|
||||||
|
outputdirectory="${grammar.output.dir}"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="compile" depends="compile-parser">
|
||||||
|
<!-- Make build directory if it does not exist -->
|
||||||
|
<mkdir dir="${build.dir}"/>
|
||||||
|
|
||||||
|
<!-- Compile all sources to build directory -->
|
||||||
|
<javac
|
||||||
|
srcdir="${src.dir}"
|
||||||
|
destdir="${build.dir}"
|
||||||
|
classpathref="javac.path"/>
|
||||||
|
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="dist" depends="init,compile"/>
|
||||||
|
</project>
|
6
project.properties
Normal file
6
project.properties
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
src.dir=src
|
||||||
|
build.dir=build
|
||||||
|
dist.dir=dist
|
||||||
|
lib.dir=lib
|
||||||
|
grammar.file=${src.dir}/edu/utexas/cs345/jdblisp/Parser.jj
|
||||||
|
grammar.output.dir=${src.dir}/edu/utexas/cs345/jdblisp/parser
|
11
src/edu/utexas/cs345/jdblisp/Lisp.java
Normal file
11
src/edu/utexas/cs345/jdblisp/Lisp.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package edu.utexas.cs345.jdblisp;
|
||||||
|
/**
|
||||||
|
* @author Jonathan Bernard (jdbernard@gmail.com)
|
||||||
|
*/
|
||||||
|
public class Lisp {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
71
src/edu/utexas/cs345/jdblisp/Parser.jj
Normal file
71
src/edu/utexas/cs345/jdblisp/Parser.jj
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/**
|
||||||
|
* Grammer and parser definition for JDB-Lisp
|
||||||
|
*/
|
||||||
|
|
||||||
|
options {
|
||||||
|
JDK_VERSION = "1.5";
|
||||||
|
}
|
||||||
|
PARSER_BEGIN(Parser)
|
||||||
|
package edu.utexas.cs345.jdblisp.parser;
|
||||||
|
|
||||||
|
import edu.utexas.cs345.jdblisp.data.*;
|
||||||
|
public class Parser {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
PARSER_END(Parser)
|
||||||
|
|
||||||
|
SKIP : /* WHITE SPACE */
|
||||||
|
{ " "
|
||||||
|
| "\r"
|
||||||
|
| "\t"
|
||||||
|
| "\n"
|
||||||
|
| "\n\r"
|
||||||
|
}
|
||||||
|
|
||||||
|
TOKEN : /* PUNCTUATION */
|
||||||
|
{ < LPAREN: "(" >
|
||||||
|
| < RPAREN: ")" >
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TOKEN : /* LITERALS & SYMBOLS */
|
||||||
|
{ < NUMB: (["+", "-"])? (["0"-"9"])+ ("." (["0"-"9"])+ )? >
|
||||||
|
| < STRG: "\"" (["A"-"Z", "a"-"z", "_"])* "\"" >
|
||||||
|
| < SYMB: ([ "A"-"Z",
|
||||||
|
"a"-"z",
|
||||||
|
"_",
|
||||||
|
"+", "-", "*", "/", "="])+ >
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SExp -> Symbol | Str | Num | List | "'" SExp
|
||||||
|
*/
|
||||||
|
SExp sexp():
|
||||||
|
{ SExp s = null; Token t;
|
||||||
|
}
|
||||||
|
{ t = <SYMB> { return new Symbol(t); }
|
||||||
|
| t = <STRG> { return new Str(t); }
|
||||||
|
| t = <NUMB> { return new Num(t); }
|
||||||
|
| s = list() { return s; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List -> "(" Seq ")"
|
||||||
|
*/
|
||||||
|
List list():
|
||||||
|
{ Seq s;
|
||||||
|
}
|
||||||
|
{ <LPAREN> s = seq() <RPAREN> { return (s == null) ? null : new List(s); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Seq -> null | SExp Seq
|
||||||
|
*/
|
||||||
|
Seq seq():
|
||||||
|
{ Seq sq; SExp se;
|
||||||
|
}
|
||||||
|
{ [ se = sexp() sq = seq() { return new Seq(se, sq); } ]
|
||||||
|
|
||||||
|
{ return null; }
|
||||||
|
}
|
17
src/edu/utexas/cs345/jdblisp/data/List.java
Normal file
17
src/edu/utexas/cs345/jdblisp/data/List.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package edu.utexas.cs345.jdblisp.data;
|
||||||
|
/**
|
||||||
|
* @author Jonathan Bernard (jdbernard@gmail.com)
|
||||||
|
*/
|
||||||
|
public class List implements SExp {
|
||||||
|
public final Seq<SExp> seq;
|
||||||
|
|
||||||
|
public List(Seq<SExp> seq) {
|
||||||
|
this.seq = seq;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SExp eval(SExp sexp, SymbolTable table) {
|
||||||
|
// TODO
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
16
src/edu/utexas/cs345/jdblisp/data/Num.java
Normal file
16
src/edu/utexas/cs345/jdblisp/data/Num.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package edu.utexas.cs345.jdblisp.data;
|
||||||
|
/**
|
||||||
|
* @author Jonathan Bernard (jdbernard@gmail.com)
|
||||||
|
*/
|
||||||
|
public class Num implements SExp {
|
||||||
|
|
||||||
|
public Num(String n) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
public SExp eval(SExp sexp, SymbolTable table) {
|
||||||
|
// TODO
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
9
src/edu/utexas/cs345/jdblisp/data/SExp.java
Normal file
9
src/edu/utexas/cs345/jdblisp/data/SExp.java
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package edu.utexas.cs345.jdblisp.data;
|
||||||
|
/**
|
||||||
|
* SExp
|
||||||
|
* @author Jonathan Bernard (jdbernard@gmail.com)
|
||||||
|
*/
|
||||||
|
public interface SExp {
|
||||||
|
|
||||||
|
SymbolTable eval(SExp sexp, SymbolTable table);
|
||||||
|
}
|
29
src/edu/utexas/cs345/jdblisp/data/Seq.java
Normal file
29
src/edu/utexas/cs345/jdblisp/data/Seq.java
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package edu.utexas.cs345.jdblisp.data;
|
||||||
|
/**
|
||||||
|
* Seq
|
||||||
|
* @author Jonathan Bernard (jdbernard@gmail.com)
|
||||||
|
*/
|
||||||
|
public class Seq<T extends SExp> implements SExp {
|
||||||
|
|
||||||
|
public final T car;
|
||||||
|
public final Seq<T> cdr;
|
||||||
|
|
||||||
|
public Seq(T car, Seq<T> cdr) {
|
||||||
|
this.car = car;
|
||||||
|
this.cdr = cdr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Seq(T... elements) {
|
||||||
|
int idx = elements.length;
|
||||||
|
Seq last = null;
|
||||||
|
while (idx > 1) last = new Seq(elements[--idx], last);
|
||||||
|
|
||||||
|
this.car = elements[0];
|
||||||
|
this.cdr = last;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SExp eval(SExp sexp, SymbolTable table) {
|
||||||
|
// TODO
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
11
src/edu/utexas/cs345/jdblisp/data/Str.java
Normal file
11
src/edu/utexas/cs345/jdblisp/data/Str.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package edu.utexas.cs345.jdblisp.data;
|
||||||
|
/**
|
||||||
|
* @author Jonathan Bernard (jdbernard@gmail.com)
|
||||||
|
*/
|
||||||
|
public class Str implements SExp {
|
||||||
|
|
||||||
|
public SExp eval(SExp sexp, SymbolTable table) {
|
||||||
|
// TODO
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
16
src/edu/utexas/cs345/jdblisp/data/Symbol.java
Normal file
16
src/edu/utexas/cs345/jdblisp/data/Symbol.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package edu.utexas.cs345.jdblisp.data;
|
||||||
|
/**
|
||||||
|
* @author Jonathan Bernard (jdbernard@gmail.com)
|
||||||
|
*/
|
||||||
|
public class Symbol implements SExp {
|
||||||
|
public final String name;
|
||||||
|
|
||||||
|
public Symbol(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SExp eval(SExp sexp, SymbolTable table) {
|
||||||
|
// TODO
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
198
src/edu/utexas/cs345/jdblisp/parser/ParseException.java
Normal file
198
src/edu/utexas/cs345/jdblisp/parser/ParseException.java
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 4.1 */
|
||||||
|
/* JavaCCOptions:KEEP_LINE_COL=null */
|
||||||
|
package edu.utexas.cs345.jdblisp.parser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This exception is thrown when parse errors are encountered.
|
||||||
|
* You can explicitly create objects of this exception type by
|
||||||
|
* calling the method generateParseException in the generated
|
||||||
|
* parser.
|
||||||
|
*
|
||||||
|
* You can modify this class to customize your error reporting
|
||||||
|
* mechanisms so long as you retain the public fields.
|
||||||
|
*/
|
||||||
|
public class ParseException extends Exception {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This constructor is used by the method "generateParseException"
|
||||||
|
* in the generated parser. Calling this constructor generates
|
||||||
|
* a new object of this type with the fields "currentToken",
|
||||||
|
* "expectedTokenSequences", and "tokenImage" set. The boolean
|
||||||
|
* flag "specialConstructor" is also set to true to indicate that
|
||||||
|
* this constructor was used to create this object.
|
||||||
|
* This constructor calls its super class with the empty string
|
||||||
|
* to force the "toString" method of parent class "Throwable" to
|
||||||
|
* print the error message in the form:
|
||||||
|
* ParseException: <result of getMessage>
|
||||||
|
*/
|
||||||
|
public ParseException(Token currentTokenVal,
|
||||||
|
int[][] expectedTokenSequencesVal,
|
||||||
|
String[] tokenImageVal
|
||||||
|
)
|
||||||
|
{
|
||||||
|
super("");
|
||||||
|
specialConstructor = true;
|
||||||
|
currentToken = currentTokenVal;
|
||||||
|
expectedTokenSequences = expectedTokenSequencesVal;
|
||||||
|
tokenImage = tokenImageVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The following constructors are for use by you for whatever
|
||||||
|
* purpose you can think of. Constructing the exception in this
|
||||||
|
* manner makes the exception behave in the normal way - i.e., as
|
||||||
|
* documented in the class "Throwable". The fields "errorToken",
|
||||||
|
* "expectedTokenSequences", and "tokenImage" do not contain
|
||||||
|
* relevant information. The JavaCC generated code does not use
|
||||||
|
* these constructors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public ParseException() {
|
||||||
|
super();
|
||||||
|
specialConstructor = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor with message. */
|
||||||
|
public ParseException(String message) {
|
||||||
|
super(message);
|
||||||
|
specialConstructor = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This variable determines which constructor was used to create
|
||||||
|
* this object and thereby affects the semantics of the
|
||||||
|
* "getMessage" method (see below).
|
||||||
|
*/
|
||||||
|
protected boolean specialConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the last token that has been consumed successfully. If
|
||||||
|
* this object has been created due to a parse error, the token
|
||||||
|
* followng this token will (therefore) be the first error token.
|
||||||
|
*/
|
||||||
|
public Token currentToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Each entry in this array is an array of integers. Each array
|
||||||
|
* of integers represents a sequence of tokens (by their ordinal
|
||||||
|
* values) that is expected at this point of the parse.
|
||||||
|
*/
|
||||||
|
public int[][] expectedTokenSequences;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a reference to the "tokenImage" array of the generated
|
||||||
|
* parser within which the parse error occurred. This array is
|
||||||
|
* defined in the generated ...Constants interface.
|
||||||
|
*/
|
||||||
|
public String[] tokenImage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method has the standard behavior when this object has been
|
||||||
|
* created using the standard constructors. Otherwise, it uses
|
||||||
|
* "currentToken" and "expectedTokenSequences" to generate a parse
|
||||||
|
* error message and returns it. If this object has been created
|
||||||
|
* due to a parse error, and you do not catch it (it gets thrown
|
||||||
|
* from the parser), then this method is called during the printing
|
||||||
|
* of the final stack trace, and hence the correct error message
|
||||||
|
* gets displayed.
|
||||||
|
*/
|
||||||
|
public String getMessage() {
|
||||||
|
if (!specialConstructor) {
|
||||||
|
return super.getMessage();
|
||||||
|
}
|
||||||
|
StringBuffer expected = new StringBuffer();
|
||||||
|
int maxSize = 0;
|
||||||
|
for (int i = 0; i < expectedTokenSequences.length; i++) {
|
||||||
|
if (maxSize < expectedTokenSequences[i].length) {
|
||||||
|
maxSize = expectedTokenSequences[i].length;
|
||||||
|
}
|
||||||
|
for (int j = 0; j < expectedTokenSequences[i].length; j++) {
|
||||||
|
expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
|
||||||
|
}
|
||||||
|
if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
|
||||||
|
expected.append("...");
|
||||||
|
}
|
||||||
|
expected.append(eol).append(" ");
|
||||||
|
}
|
||||||
|
String retval = "Encountered \"";
|
||||||
|
Token tok = currentToken.next;
|
||||||
|
for (int i = 0; i < maxSize; i++) {
|
||||||
|
if (i != 0) retval += " ";
|
||||||
|
if (tok.kind == 0) {
|
||||||
|
retval += tokenImage[0];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
retval += " " + tokenImage[tok.kind];
|
||||||
|
retval += " \"";
|
||||||
|
retval += add_escapes(tok.image);
|
||||||
|
retval += " \"";
|
||||||
|
tok = tok.next;
|
||||||
|
}
|
||||||
|
retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
|
||||||
|
retval += "." + eol;
|
||||||
|
if (expectedTokenSequences.length == 1) {
|
||||||
|
retval += "Was expecting:" + eol + " ";
|
||||||
|
} else {
|
||||||
|
retval += "Was expecting one of:" + eol + " ";
|
||||||
|
}
|
||||||
|
retval += expected.toString();
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The end of line string for this machine.
|
||||||
|
*/
|
||||||
|
protected String eol = System.getProperty("line.separator", "\n");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to convert raw characters to their escaped version
|
||||||
|
* when these raw version cannot be used as part of an ASCII
|
||||||
|
* string literal.
|
||||||
|
*/
|
||||||
|
protected String add_escapes(String str) {
|
||||||
|
StringBuffer retval = new StringBuffer();
|
||||||
|
char ch;
|
||||||
|
for (int i = 0; i < str.length(); i++) {
|
||||||
|
switch (str.charAt(i))
|
||||||
|
{
|
||||||
|
case 0 :
|
||||||
|
continue;
|
||||||
|
case '\b':
|
||||||
|
retval.append("\\b");
|
||||||
|
continue;
|
||||||
|
case '\t':
|
||||||
|
retval.append("\\t");
|
||||||
|
continue;
|
||||||
|
case '\n':
|
||||||
|
retval.append("\\n");
|
||||||
|
continue;
|
||||||
|
case '\f':
|
||||||
|
retval.append("\\f");
|
||||||
|
continue;
|
||||||
|
case '\r':
|
||||||
|
retval.append("\\r");
|
||||||
|
continue;
|
||||||
|
case '\"':
|
||||||
|
retval.append("\\\"");
|
||||||
|
continue;
|
||||||
|
case '\'':
|
||||||
|
retval.append("\\\'");
|
||||||
|
continue;
|
||||||
|
case '\\':
|
||||||
|
retval.append("\\\\");
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
|
||||||
|
String s = "0000" + Integer.toString(ch, 16);
|
||||||
|
retval.append("\\u" + s.substring(s.length() - 4, s.length()));
|
||||||
|
} else {
|
||||||
|
retval.append(ch);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retval.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/* JavaCC - OriginalChecksum=6424bd83be8a27da5fcf7238642002f6 (do not edit this line) */
|
261
src/edu/utexas/cs345/jdblisp/parser/Parser.java
Normal file
261
src/edu/utexas/cs345/jdblisp/parser/Parser.java
Normal file
@ -0,0 +1,261 @@
|
|||||||
|
/* Generated By:JavaCC: Do not edit this line. Parser.java */
|
||||||
|
package edu.utexas.cs345.jdblisp.parser;
|
||||||
|
|
||||||
|
import edu.utexas.cs345.jdblisp.data.*;
|
||||||
|
public class Parser implements ParserConstants {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SExp -> Symbol | Str | Num | List | "'" SExp
|
||||||
|
*/
|
||||||
|
static final public SExp sexp() throws ParseException {
|
||||||
|
SExp s = null; Token t;
|
||||||
|
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
|
||||||
|
case SYMB:
|
||||||
|
t = jj_consume_token(SYMB);
|
||||||
|
{if (true) return new Symbol(t);}
|
||||||
|
break;
|
||||||
|
case STRG:
|
||||||
|
t = jj_consume_token(STRG);
|
||||||
|
{if (true) return new Str(t);}
|
||||||
|
break;
|
||||||
|
case NUMB:
|
||||||
|
t = jj_consume_token(NUMB);
|
||||||
|
{if (true) return new Num(t);}
|
||||||
|
break;
|
||||||
|
case LPAREN:
|
||||||
|
s = list();
|
||||||
|
{if (true) return s;}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
jj_la1[0] = jj_gen;
|
||||||
|
jj_consume_token(-1);
|
||||||
|
throw new ParseException();
|
||||||
|
}
|
||||||
|
throw new Error("Missing return statement in function");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List -> "(" Seq ")"
|
||||||
|
*/
|
||||||
|
static final public List list() throws ParseException {
|
||||||
|
Seq s;
|
||||||
|
jj_consume_token(LPAREN);
|
||||||
|
s = seq();
|
||||||
|
jj_consume_token(RPAREN);
|
||||||
|
{if (true) return (s == null) ? null : new List(s);}
|
||||||
|
throw new Error("Missing return statement in function");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Seq -> null | SExp Seq
|
||||||
|
*/
|
||||||
|
static final public Seq seq() throws ParseException {
|
||||||
|
Seq sq; SExp se;
|
||||||
|
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
|
||||||
|
case LPAREN:
|
||||||
|
case NUMB:
|
||||||
|
case STRG:
|
||||||
|
case SYMB:
|
||||||
|
se = sexp();
|
||||||
|
sq = seq();
|
||||||
|
{if (true) return new Seq(se, sq);}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
jj_la1[1] = jj_gen;
|
||||||
|
;
|
||||||
|
}
|
||||||
|
{if (true) return null;}
|
||||||
|
throw new Error("Missing return statement in function");
|
||||||
|
}
|
||||||
|
|
||||||
|
static private boolean jj_initialized_once = false;
|
||||||
|
/** Generated Token Manager. */
|
||||||
|
static public ParserTokenManager token_source;
|
||||||
|
static SimpleCharStream jj_input_stream;
|
||||||
|
/** Current token. */
|
||||||
|
static public Token token;
|
||||||
|
/** Next token. */
|
||||||
|
static public Token jj_nt;
|
||||||
|
static private int jj_ntk;
|
||||||
|
static private int jj_gen;
|
||||||
|
static final private int[] jj_la1 = new int[2];
|
||||||
|
static private int[] jj_la1_0;
|
||||||
|
static {
|
||||||
|
jj_la1_init_0();
|
||||||
|
}
|
||||||
|
private static void jj_la1_init_0() {
|
||||||
|
jj_la1_0 = new int[] {0x740,0x740,};
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor with InputStream. */
|
||||||
|
public Parser(java.io.InputStream stream) {
|
||||||
|
this(stream, null);
|
||||||
|
}
|
||||||
|
/** Constructor with InputStream and supplied encoding */
|
||||||
|
public Parser(java.io.InputStream stream, String encoding) {
|
||||||
|
if (jj_initialized_once) {
|
||||||
|
System.out.println("ERROR: Second call to constructor of static parser. ");
|
||||||
|
System.out.println(" You must either use ReInit() or set the JavaCC option STATIC to false");
|
||||||
|
System.out.println(" during parser generation.");
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
|
jj_initialized_once = true;
|
||||||
|
try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
|
||||||
|
token_source = new ParserTokenManager(jj_input_stream);
|
||||||
|
token = new Token();
|
||||||
|
jj_ntk = -1;
|
||||||
|
jj_gen = 0;
|
||||||
|
for (int i = 0; i < 2; i++) jj_la1[i] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reinitialise. */
|
||||||
|
static public void ReInit(java.io.InputStream stream) {
|
||||||
|
ReInit(stream, null);
|
||||||
|
}
|
||||||
|
/** Reinitialise. */
|
||||||
|
static public void ReInit(java.io.InputStream stream, String encoding) {
|
||||||
|
try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
|
||||||
|
token_source.ReInit(jj_input_stream);
|
||||||
|
token = new Token();
|
||||||
|
jj_ntk = -1;
|
||||||
|
jj_gen = 0;
|
||||||
|
for (int i = 0; i < 2; i++) jj_la1[i] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor. */
|
||||||
|
public Parser(java.io.Reader stream) {
|
||||||
|
if (jj_initialized_once) {
|
||||||
|
System.out.println("ERROR: Second call to constructor of static parser. ");
|
||||||
|
System.out.println(" You must either use ReInit() or set the JavaCC option STATIC to false");
|
||||||
|
System.out.println(" during parser generation.");
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
|
jj_initialized_once = true;
|
||||||
|
jj_input_stream = new SimpleCharStream(stream, 1, 1);
|
||||||
|
token_source = new ParserTokenManager(jj_input_stream);
|
||||||
|
token = new Token();
|
||||||
|
jj_ntk = -1;
|
||||||
|
jj_gen = 0;
|
||||||
|
for (int i = 0; i < 2; i++) jj_la1[i] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reinitialise. */
|
||||||
|
static public void ReInit(java.io.Reader stream) {
|
||||||
|
jj_input_stream.ReInit(stream, 1, 1);
|
||||||
|
token_source.ReInit(jj_input_stream);
|
||||||
|
token = new Token();
|
||||||
|
jj_ntk = -1;
|
||||||
|
jj_gen = 0;
|
||||||
|
for (int i = 0; i < 2; i++) jj_la1[i] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor with generated Token Manager. */
|
||||||
|
public Parser(ParserTokenManager tm) {
|
||||||
|
if (jj_initialized_once) {
|
||||||
|
System.out.println("ERROR: Second call to constructor of static parser. ");
|
||||||
|
System.out.println(" You must either use ReInit() or set the JavaCC option STATIC to false");
|
||||||
|
System.out.println(" during parser generation.");
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
|
jj_initialized_once = true;
|
||||||
|
token_source = tm;
|
||||||
|
token = new Token();
|
||||||
|
jj_ntk = -1;
|
||||||
|
jj_gen = 0;
|
||||||
|
for (int i = 0; i < 2; i++) jj_la1[i] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reinitialise. */
|
||||||
|
public void ReInit(ParserTokenManager tm) {
|
||||||
|
token_source = tm;
|
||||||
|
token = new Token();
|
||||||
|
jj_ntk = -1;
|
||||||
|
jj_gen = 0;
|
||||||
|
for (int i = 0; i < 2; i++) jj_la1[i] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static private Token jj_consume_token(int kind) throws ParseException {
|
||||||
|
Token oldToken;
|
||||||
|
if ((oldToken = token).next != null) token = token.next;
|
||||||
|
else token = token.next = token_source.getNextToken();
|
||||||
|
jj_ntk = -1;
|
||||||
|
if (token.kind == kind) {
|
||||||
|
jj_gen++;
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
token = oldToken;
|
||||||
|
jj_kind = kind;
|
||||||
|
throw generateParseException();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Get the next Token. */
|
||||||
|
static final public Token getNextToken() {
|
||||||
|
if (token.next != null) token = token.next;
|
||||||
|
else token = token.next = token_source.getNextToken();
|
||||||
|
jj_ntk = -1;
|
||||||
|
jj_gen++;
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get the specific Token. */
|
||||||
|
static final public Token getToken(int index) {
|
||||||
|
Token t = token;
|
||||||
|
for (int i = 0; i < index; i++) {
|
||||||
|
if (t.next != null) t = t.next;
|
||||||
|
else t = t.next = token_source.getNextToken();
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
static private int jj_ntk() {
|
||||||
|
if ((jj_nt=token.next) == null)
|
||||||
|
return (jj_ntk = (token.next=token_source.getNextToken()).kind);
|
||||||
|
else
|
||||||
|
return (jj_ntk = jj_nt.kind);
|
||||||
|
}
|
||||||
|
|
||||||
|
static private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
|
||||||
|
static private int[] jj_expentry;
|
||||||
|
static private int jj_kind = -1;
|
||||||
|
|
||||||
|
/** Generate ParseException. */
|
||||||
|
static public ParseException generateParseException() {
|
||||||
|
jj_expentries.clear();
|
||||||
|
boolean[] la1tokens = new boolean[11];
|
||||||
|
if (jj_kind >= 0) {
|
||||||
|
la1tokens[jj_kind] = true;
|
||||||
|
jj_kind = -1;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
if (jj_la1[i] == jj_gen) {
|
||||||
|
for (int j = 0; j < 32; j++) {
|
||||||
|
if ((jj_la1_0[i] & (1<<j)) != 0) {
|
||||||
|
la1tokens[j] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 11; i++) {
|
||||||
|
if (la1tokens[i]) {
|
||||||
|
jj_expentry = new int[1];
|
||||||
|
jj_expentry[0] = i;
|
||||||
|
jj_expentries.add(jj_expentry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int[][] exptokseq = new int[jj_expentries.size()][];
|
||||||
|
for (int i = 0; i < jj_expentries.size(); i++) {
|
||||||
|
exptokseq[i] = jj_expentries.get(i);
|
||||||
|
}
|
||||||
|
return new ParseException(token, exptokseq, tokenImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Enable tracing. */
|
||||||
|
static final public void enable_tracing() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Disable tracing. */
|
||||||
|
static final public void disable_tracing() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
42
src/edu/utexas/cs345/jdblisp/parser/ParserConstants.java
Normal file
42
src/edu/utexas/cs345/jdblisp/parser/ParserConstants.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/* Generated By:JavaCC: Do not edit this line. ParserConstants.java */
|
||||||
|
package edu.utexas.cs345.jdblisp.parser;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Token literal values and constants.
|
||||||
|
* Generated by org.javacc.parser.OtherFilesGen#start()
|
||||||
|
*/
|
||||||
|
public interface ParserConstants {
|
||||||
|
|
||||||
|
/** End of File. */
|
||||||
|
int EOF = 0;
|
||||||
|
/** RegularExpression Id. */
|
||||||
|
int LPAREN = 6;
|
||||||
|
/** RegularExpression Id. */
|
||||||
|
int RPAREN = 7;
|
||||||
|
/** RegularExpression Id. */
|
||||||
|
int NUMB = 8;
|
||||||
|
/** RegularExpression Id. */
|
||||||
|
int STRG = 9;
|
||||||
|
/** RegularExpression Id. */
|
||||||
|
int SYMB = 10;
|
||||||
|
|
||||||
|
/** Lexical state. */
|
||||||
|
int DEFAULT = 0;
|
||||||
|
|
||||||
|
/** Literal token values. */
|
||||||
|
String[] tokenImage = {
|
||||||
|
"<EOF>",
|
||||||
|
"\" \"",
|
||||||
|
"\"\\r\"",
|
||||||
|
"\"\\t\"",
|
||||||
|
"\"\\n\"",
|
||||||
|
"\"\\n\\r\"",
|
||||||
|
"\"(\"",
|
||||||
|
"\")\"",
|
||||||
|
"<NUMB>",
|
||||||
|
"<STRG>",
|
||||||
|
"<SYMB>",
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
368
src/edu/utexas/cs345/jdblisp/parser/ParserTokenManager.java
Normal file
368
src/edu/utexas/cs345/jdblisp/parser/ParserTokenManager.java
Normal file
@ -0,0 +1,368 @@
|
|||||||
|
/* Generated By:JavaCC: Do not edit this line. ParserTokenManager.java */
|
||||||
|
package edu.utexas.cs345.jdblisp.parser;
|
||||||
|
import edu.utexas.cs345.jdblisp.data.*;
|
||||||
|
|
||||||
|
/** Token Manager. */
|
||||||
|
public class ParserTokenManager implements ParserConstants
|
||||||
|
{
|
||||||
|
|
||||||
|
/** Debug output. */
|
||||||
|
public static java.io.PrintStream debugStream = System.out;
|
||||||
|
/** Set debug output. */
|
||||||
|
public static void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
|
||||||
|
private static final int jjStopStringLiteralDfa_0(int pos, long active0)
|
||||||
|
{
|
||||||
|
switch (pos)
|
||||||
|
{
|
||||||
|
default :
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private static final int jjStartNfa_0(int pos, long active0)
|
||||||
|
{
|
||||||
|
return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
|
||||||
|
}
|
||||||
|
static private int jjStopAtPos(int pos, int kind)
|
||||||
|
{
|
||||||
|
jjmatchedKind = kind;
|
||||||
|
jjmatchedPos = pos;
|
||||||
|
return pos + 1;
|
||||||
|
}
|
||||||
|
static private int jjMoveStringLiteralDfa0_0()
|
||||||
|
{
|
||||||
|
switch(curChar)
|
||||||
|
{
|
||||||
|
case 10:
|
||||||
|
jjmatchedKind = 4;
|
||||||
|
return jjMoveStringLiteralDfa1_0(0x20L);
|
||||||
|
case 40:
|
||||||
|
return jjStopAtPos(0, 6);
|
||||||
|
case 41:
|
||||||
|
return jjStopAtPos(0, 7);
|
||||||
|
default :
|
||||||
|
return jjMoveNfa_0(0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static private int jjMoveStringLiteralDfa1_0(long active0)
|
||||||
|
{
|
||||||
|
try { curChar = input_stream.readChar(); }
|
||||||
|
catch(java.io.IOException e) {
|
||||||
|
jjStopStringLiteralDfa_0(0, active0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
switch(curChar)
|
||||||
|
{
|
||||||
|
case 13:
|
||||||
|
if ((active0 & 0x20L) != 0L)
|
||||||
|
return jjStopAtPos(1, 5);
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return jjStartNfa_0(0, active0);
|
||||||
|
}
|
||||||
|
static private int jjMoveNfa_0(int startState, int curPos)
|
||||||
|
{
|
||||||
|
int startsAt = 0;
|
||||||
|
jjnewStateCnt = 8;
|
||||||
|
int i = 1;
|
||||||
|
jjstateSet[0] = startState;
|
||||||
|
int kind = 0x7fffffff;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (++jjround == 0x7fffffff)
|
||||||
|
ReInitRounds();
|
||||||
|
if (curChar < 64)
|
||||||
|
{
|
||||||
|
long l = 1L << curChar;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
switch(jjstateSet[--i])
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
if ((0x3ff000000000000L & l) != 0L)
|
||||||
|
{
|
||||||
|
if (kind > 8)
|
||||||
|
kind = 8;
|
||||||
|
jjCheckNAddTwoStates(1, 2);
|
||||||
|
}
|
||||||
|
else if ((0x2000ac0000000000L & l) != 0L)
|
||||||
|
{
|
||||||
|
if (kind > 10)
|
||||||
|
kind = 10;
|
||||||
|
jjCheckNAdd(7);
|
||||||
|
}
|
||||||
|
else if (curChar == 34)
|
||||||
|
jjAddStates(0, 1);
|
||||||
|
if ((0x280000000000L & l) != 0L)
|
||||||
|
jjCheckNAdd(1);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if ((0x3ff000000000000L & l) == 0L)
|
||||||
|
break;
|
||||||
|
if (kind > 8)
|
||||||
|
kind = 8;
|
||||||
|
jjCheckNAddTwoStates(1, 2);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (curChar == 46)
|
||||||
|
jjCheckNAdd(3);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if ((0x3ff000000000000L & l) == 0L)
|
||||||
|
break;
|
||||||
|
if (kind > 8)
|
||||||
|
kind = 8;
|
||||||
|
jjCheckNAdd(3);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if (curChar == 34)
|
||||||
|
jjAddStates(0, 1);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
if (curChar == 34 && kind > 9)
|
||||||
|
kind = 9;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
if ((0x2000ac0000000000L & l) == 0L)
|
||||||
|
break;
|
||||||
|
if (kind > 10)
|
||||||
|
kind = 10;
|
||||||
|
jjCheckNAdd(7);
|
||||||
|
break;
|
||||||
|
default : break;
|
||||||
|
}
|
||||||
|
} while(i != startsAt);
|
||||||
|
}
|
||||||
|
else if (curChar < 128)
|
||||||
|
{
|
||||||
|
long l = 1L << (curChar & 077);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
switch(jjstateSet[--i])
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
case 7:
|
||||||
|
if ((0x7fffffe87fffffeL & l) == 0L)
|
||||||
|
break;
|
||||||
|
if (kind > 10)
|
||||||
|
kind = 10;
|
||||||
|
jjCheckNAdd(7);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if ((0x7fffffe87fffffeL & l) != 0L)
|
||||||
|
jjAddStates(0, 1);
|
||||||
|
break;
|
||||||
|
default : break;
|
||||||
|
}
|
||||||
|
} while(i != startsAt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i2 = (curChar & 0xff) >> 6;
|
||||||
|
long l2 = 1L << (curChar & 077);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
switch(jjstateSet[--i])
|
||||||
|
{
|
||||||
|
default : break;
|
||||||
|
}
|
||||||
|
} while(i != startsAt);
|
||||||
|
}
|
||||||
|
if (kind != 0x7fffffff)
|
||||||
|
{
|
||||||
|
jjmatchedKind = kind;
|
||||||
|
jjmatchedPos = curPos;
|
||||||
|
kind = 0x7fffffff;
|
||||||
|
}
|
||||||
|
++curPos;
|
||||||
|
if ((i = jjnewStateCnt) == (startsAt = 8 - (jjnewStateCnt = startsAt)))
|
||||||
|
return curPos;
|
||||||
|
try { curChar = input_stream.readChar(); }
|
||||||
|
catch(java.io.IOException e) { return curPos; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static final int[] jjnextStates = {
|
||||||
|
5, 6,
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Token literal values. */
|
||||||
|
public static final String[] jjstrLiteralImages = {
|
||||||
|
"", null, null, null, null, null, "\50", "\51", null, null, null, };
|
||||||
|
|
||||||
|
/** Lexer state names. */
|
||||||
|
public static final String[] lexStateNames = {
|
||||||
|
"DEFAULT",
|
||||||
|
};
|
||||||
|
static final long[] jjtoToken = {
|
||||||
|
0x7c1L,
|
||||||
|
};
|
||||||
|
static final long[] jjtoSkip = {
|
||||||
|
0x3eL,
|
||||||
|
};
|
||||||
|
static protected SimpleCharStream input_stream;
|
||||||
|
static private final int[] jjrounds = new int[8];
|
||||||
|
static private final int[] jjstateSet = new int[16];
|
||||||
|
static protected char curChar;
|
||||||
|
/** Constructor. */
|
||||||
|
public ParserTokenManager(SimpleCharStream stream){
|
||||||
|
if (input_stream != null)
|
||||||
|
throw new TokenMgrError("ERROR: Second call to constructor of static lexer. You must use ReInit() to initialize the static variables.", TokenMgrError.STATIC_LEXER_ERROR);
|
||||||
|
input_stream = stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor. */
|
||||||
|
public ParserTokenManager(SimpleCharStream stream, int lexState){
|
||||||
|
this(stream);
|
||||||
|
SwitchTo(lexState);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reinitialise parser. */
|
||||||
|
static public void ReInit(SimpleCharStream stream)
|
||||||
|
{
|
||||||
|
jjmatchedPos = jjnewStateCnt = 0;
|
||||||
|
curLexState = defaultLexState;
|
||||||
|
input_stream = stream;
|
||||||
|
ReInitRounds();
|
||||||
|
}
|
||||||
|
static private void ReInitRounds()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
jjround = 0x80000001;
|
||||||
|
for (i = 8; i-- > 0;)
|
||||||
|
jjrounds[i] = 0x80000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reinitialise parser. */
|
||||||
|
static public void ReInit(SimpleCharStream stream, int lexState)
|
||||||
|
{
|
||||||
|
ReInit(stream);
|
||||||
|
SwitchTo(lexState);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Switch to specified lex state. */
|
||||||
|
static public void SwitchTo(int lexState)
|
||||||
|
{
|
||||||
|
if (lexState >= 1 || lexState < 0)
|
||||||
|
throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
|
||||||
|
else
|
||||||
|
curLexState = lexState;
|
||||||
|
}
|
||||||
|
|
||||||
|
static protected Token jjFillToken()
|
||||||
|
{
|
||||||
|
final Token t;
|
||||||
|
final String curTokenImage;
|
||||||
|
final int beginLine;
|
||||||
|
final int endLine;
|
||||||
|
final int beginColumn;
|
||||||
|
final int endColumn;
|
||||||
|
String im = jjstrLiteralImages[jjmatchedKind];
|
||||||
|
curTokenImage = (im == null) ? input_stream.GetImage() : im;
|
||||||
|
beginLine = input_stream.getBeginLine();
|
||||||
|
beginColumn = input_stream.getBeginColumn();
|
||||||
|
endLine = input_stream.getEndLine();
|
||||||
|
endColumn = input_stream.getEndColumn();
|
||||||
|
t = Token.newToken(jjmatchedKind, curTokenImage);
|
||||||
|
|
||||||
|
t.beginLine = beginLine;
|
||||||
|
t.endLine = endLine;
|
||||||
|
t.beginColumn = beginColumn;
|
||||||
|
t.endColumn = endColumn;
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int curLexState = 0;
|
||||||
|
static int defaultLexState = 0;
|
||||||
|
static int jjnewStateCnt;
|
||||||
|
static int jjround;
|
||||||
|
static int jjmatchedPos;
|
||||||
|
static int jjmatchedKind;
|
||||||
|
|
||||||
|
/** Get the next Token. */
|
||||||
|
public static Token getNextToken()
|
||||||
|
{
|
||||||
|
Token matchedToken;
|
||||||
|
int curPos = 0;
|
||||||
|
|
||||||
|
EOFLoop :
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
curChar = input_stream.BeginToken();
|
||||||
|
}
|
||||||
|
catch(java.io.IOException e)
|
||||||
|
{
|
||||||
|
jjmatchedKind = 0;
|
||||||
|
matchedToken = jjFillToken();
|
||||||
|
return matchedToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
try { input_stream.backup(0);
|
||||||
|
while (curChar <= 32 && (0x100002200L & (1L << curChar)) != 0L)
|
||||||
|
curChar = input_stream.BeginToken();
|
||||||
|
}
|
||||||
|
catch (java.io.IOException e1) { continue EOFLoop; }
|
||||||
|
jjmatchedKind = 0x7fffffff;
|
||||||
|
jjmatchedPos = 0;
|
||||||
|
curPos = jjMoveStringLiteralDfa0_0();
|
||||||
|
if (jjmatchedKind != 0x7fffffff)
|
||||||
|
{
|
||||||
|
if (jjmatchedPos + 1 < curPos)
|
||||||
|
input_stream.backup(curPos - jjmatchedPos - 1);
|
||||||
|
if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
|
||||||
|
{
|
||||||
|
matchedToken = jjFillToken();
|
||||||
|
return matchedToken;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
continue EOFLoop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int error_line = input_stream.getEndLine();
|
||||||
|
int error_column = input_stream.getEndColumn();
|
||||||
|
String error_after = null;
|
||||||
|
boolean EOFSeen = false;
|
||||||
|
try { input_stream.readChar(); input_stream.backup(1); }
|
||||||
|
catch (java.io.IOException e1) {
|
||||||
|
EOFSeen = true;
|
||||||
|
error_after = curPos <= 1 ? "" : input_stream.GetImage();
|
||||||
|
if (curChar == '\n' || curChar == '\r') {
|
||||||
|
error_line++;
|
||||||
|
error_column = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
error_column++;
|
||||||
|
}
|
||||||
|
if (!EOFSeen) {
|
||||||
|
input_stream.backup(1);
|
||||||
|
error_after = curPos <= 1 ? "" : input_stream.GetImage();
|
||||||
|
}
|
||||||
|
throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static private void jjCheckNAdd(int state)
|
||||||
|
{
|
||||||
|
if (jjrounds[state] != jjround)
|
||||||
|
{
|
||||||
|
jjstateSet[jjnewStateCnt++] = state;
|
||||||
|
jjrounds[state] = jjround;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static private void jjAddStates(int start, int end)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
jjstateSet[jjnewStateCnt++] = jjnextStates[start];
|
||||||
|
} while (start++ != end);
|
||||||
|
}
|
||||||
|
static private void jjCheckNAddTwoStates(int state1, int state2)
|
||||||
|
{
|
||||||
|
jjCheckNAdd(state1);
|
||||||
|
jjCheckNAdd(state2);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
476
src/edu/utexas/cs345/jdblisp/parser/SimpleCharStream.java
Normal file
476
src/edu/utexas/cs345/jdblisp/parser/SimpleCharStream.java
Normal file
@ -0,0 +1,476 @@
|
|||||||
|
/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.1 */
|
||||||
|
/* JavaCCOptions:STATIC=true */
|
||||||
|
package edu.utexas.cs345.jdblisp.parser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An implementation of interface CharStream, where the stream is assumed to
|
||||||
|
* contain only ASCII characters (without unicode processing).
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class SimpleCharStream
|
||||||
|
{
|
||||||
|
/** Whether parser is static. */
|
||||||
|
public static final boolean staticFlag = true;
|
||||||
|
static int bufsize;
|
||||||
|
static int available;
|
||||||
|
static int tokenBegin;
|
||||||
|
/** Position in buffer. */
|
||||||
|
static public int bufpos = -1;
|
||||||
|
static protected int bufline[];
|
||||||
|
static protected int bufcolumn[];
|
||||||
|
|
||||||
|
static protected int column = 0;
|
||||||
|
static protected int line = 1;
|
||||||
|
|
||||||
|
static protected boolean prevCharIsCR = false;
|
||||||
|
static protected boolean prevCharIsLF = false;
|
||||||
|
|
||||||
|
static protected java.io.Reader inputStream;
|
||||||
|
|
||||||
|
static protected char[] buffer;
|
||||||
|
static protected int maxNextCharInd = 0;
|
||||||
|
static protected int inBuf = 0;
|
||||||
|
static protected int tabSize = 8;
|
||||||
|
|
||||||
|
static protected void setTabSize(int i) { tabSize = i; }
|
||||||
|
static protected int getTabSize(int i) { return tabSize; }
|
||||||
|
|
||||||
|
|
||||||
|
static protected void ExpandBuff(boolean wrapAround)
|
||||||
|
{
|
||||||
|
char[] newbuffer = new char[bufsize + 2048];
|
||||||
|
int newbufline[] = new int[bufsize + 2048];
|
||||||
|
int newbufcolumn[] = new int[bufsize + 2048];
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (wrapAround)
|
||||||
|
{
|
||||||
|
System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
|
||||||
|
System.arraycopy(buffer, 0, newbuffer,
|
||||||
|
bufsize - tokenBegin, bufpos);
|
||||||
|
buffer = newbuffer;
|
||||||
|
|
||||||
|
System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
|
||||||
|
System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
|
||||||
|
bufline = newbufline;
|
||||||
|
|
||||||
|
System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
|
||||||
|
System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
|
||||||
|
bufcolumn = newbufcolumn;
|
||||||
|
|
||||||
|
maxNextCharInd = (bufpos += (bufsize - tokenBegin));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
|
||||||
|
buffer = newbuffer;
|
||||||
|
|
||||||
|
System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
|
||||||
|
bufline = newbufline;
|
||||||
|
|
||||||
|
System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
|
||||||
|
bufcolumn = newbufcolumn;
|
||||||
|
|
||||||
|
maxNextCharInd = (bufpos -= tokenBegin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Throwable t)
|
||||||
|
{
|
||||||
|
throw new Error(t.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bufsize += 2048;
|
||||||
|
available = bufsize;
|
||||||
|
tokenBegin = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static protected void FillBuff() throws java.io.IOException
|
||||||
|
{
|
||||||
|
if (maxNextCharInd == available)
|
||||||
|
{
|
||||||
|
if (available == bufsize)
|
||||||
|
{
|
||||||
|
if (tokenBegin > 2048)
|
||||||
|
{
|
||||||
|
bufpos = maxNextCharInd = 0;
|
||||||
|
available = tokenBegin;
|
||||||
|
}
|
||||||
|
else if (tokenBegin < 0)
|
||||||
|
bufpos = maxNextCharInd = 0;
|
||||||
|
else
|
||||||
|
ExpandBuff(false);
|
||||||
|
}
|
||||||
|
else if (available > tokenBegin)
|
||||||
|
available = bufsize;
|
||||||
|
else if ((tokenBegin - available) < 2048)
|
||||||
|
ExpandBuff(true);
|
||||||
|
else
|
||||||
|
available = tokenBegin;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i;
|
||||||
|
try {
|
||||||
|
if ((i = inputStream.read(buffer, maxNextCharInd,
|
||||||
|
available - maxNextCharInd)) == -1)
|
||||||
|
{
|
||||||
|
inputStream.close();
|
||||||
|
throw new java.io.IOException();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
maxNextCharInd += i;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch(java.io.IOException e) {
|
||||||
|
--bufpos;
|
||||||
|
backup(0);
|
||||||
|
if (tokenBegin == -1)
|
||||||
|
tokenBegin = bufpos;
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Start. */
|
||||||
|
static public char BeginToken() throws java.io.IOException
|
||||||
|
{
|
||||||
|
tokenBegin = -1;
|
||||||
|
char c = readChar();
|
||||||
|
tokenBegin = bufpos;
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static protected void UpdateLineColumn(char c)
|
||||||
|
{
|
||||||
|
column++;
|
||||||
|
|
||||||
|
if (prevCharIsLF)
|
||||||
|
{
|
||||||
|
prevCharIsLF = false;
|
||||||
|
line += (column = 1);
|
||||||
|
}
|
||||||
|
else if (prevCharIsCR)
|
||||||
|
{
|
||||||
|
prevCharIsCR = false;
|
||||||
|
if (c == '\n')
|
||||||
|
{
|
||||||
|
prevCharIsLF = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
line += (column = 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case '\r' :
|
||||||
|
prevCharIsCR = true;
|
||||||
|
break;
|
||||||
|
case '\n' :
|
||||||
|
prevCharIsLF = true;
|
||||||
|
break;
|
||||||
|
case '\t' :
|
||||||
|
column--;
|
||||||
|
column += (tabSize - (column % tabSize));
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bufline[bufpos] = line;
|
||||||
|
bufcolumn[bufpos] = column;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Read a character. */
|
||||||
|
static public char readChar() throws java.io.IOException
|
||||||
|
{
|
||||||
|
if (inBuf > 0)
|
||||||
|
{
|
||||||
|
--inBuf;
|
||||||
|
|
||||||
|
if (++bufpos == bufsize)
|
||||||
|
bufpos = 0;
|
||||||
|
|
||||||
|
return buffer[bufpos];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (++bufpos >= maxNextCharInd)
|
||||||
|
FillBuff();
|
||||||
|
|
||||||
|
char c = buffer[bufpos];
|
||||||
|
|
||||||
|
UpdateLineColumn(c);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
* @see #getEndColumn
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public int getColumn() {
|
||||||
|
return bufcolumn[bufpos];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
* @see #getEndLine
|
||||||
|
*/
|
||||||
|
|
||||||
|
static public int getLine() {
|
||||||
|
return bufline[bufpos];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get token end column number. */
|
||||||
|
static public int getEndColumn() {
|
||||||
|
return bufcolumn[bufpos];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get token end line number. */
|
||||||
|
static public int getEndLine() {
|
||||||
|
return bufline[bufpos];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get token beginning column number. */
|
||||||
|
static public int getBeginColumn() {
|
||||||
|
return bufcolumn[tokenBegin];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get token beginning line number. */
|
||||||
|
static public int getBeginLine() {
|
||||||
|
return bufline[tokenBegin];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Backup a number of characters. */
|
||||||
|
static public void backup(int amount) {
|
||||||
|
|
||||||
|
inBuf += amount;
|
||||||
|
if ((bufpos -= amount) < 0)
|
||||||
|
bufpos += bufsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor. */
|
||||||
|
public SimpleCharStream(java.io.Reader dstream, int startline,
|
||||||
|
int startcolumn, int buffersize)
|
||||||
|
{
|
||||||
|
if (inputStream != null)
|
||||||
|
throw new Error("\n ERROR: Second call to the constructor of a static SimpleCharStream.\n" +
|
||||||
|
" You must either use ReInit() or set the JavaCC option STATIC to false\n" +
|
||||||
|
" during the generation of this class.");
|
||||||
|
inputStream = dstream;
|
||||||
|
line = startline;
|
||||||
|
column = startcolumn - 1;
|
||||||
|
|
||||||
|
available = bufsize = buffersize;
|
||||||
|
buffer = new char[buffersize];
|
||||||
|
bufline = new int[buffersize];
|
||||||
|
bufcolumn = new int[buffersize];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor. */
|
||||||
|
public SimpleCharStream(java.io.Reader dstream, int startline,
|
||||||
|
int startcolumn)
|
||||||
|
{
|
||||||
|
this(dstream, startline, startcolumn, 4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor. */
|
||||||
|
public SimpleCharStream(java.io.Reader dstream)
|
||||||
|
{
|
||||||
|
this(dstream, 1, 1, 4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reinitialise. */
|
||||||
|
public void ReInit(java.io.Reader dstream, int startline,
|
||||||
|
int startcolumn, int buffersize)
|
||||||
|
{
|
||||||
|
inputStream = dstream;
|
||||||
|
line = startline;
|
||||||
|
column = startcolumn - 1;
|
||||||
|
|
||||||
|
if (buffer == null || buffersize != buffer.length)
|
||||||
|
{
|
||||||
|
available = bufsize = buffersize;
|
||||||
|
buffer = new char[buffersize];
|
||||||
|
bufline = new int[buffersize];
|
||||||
|
bufcolumn = new int[buffersize];
|
||||||
|
}
|
||||||
|
prevCharIsLF = prevCharIsCR = false;
|
||||||
|
tokenBegin = inBuf = maxNextCharInd = 0;
|
||||||
|
bufpos = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reinitialise. */
|
||||||
|
public void ReInit(java.io.Reader dstream, int startline,
|
||||||
|
int startcolumn)
|
||||||
|
{
|
||||||
|
ReInit(dstream, startline, startcolumn, 4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reinitialise. */
|
||||||
|
public void ReInit(java.io.Reader dstream)
|
||||||
|
{
|
||||||
|
ReInit(dstream, 1, 1, 4096);
|
||||||
|
}
|
||||||
|
/** Constructor. */
|
||||||
|
public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
|
||||||
|
int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
|
||||||
|
{
|
||||||
|
this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor. */
|
||||||
|
public SimpleCharStream(java.io.InputStream dstream, int startline,
|
||||||
|
int startcolumn, int buffersize)
|
||||||
|
{
|
||||||
|
this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor. */
|
||||||
|
public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
|
||||||
|
int startcolumn) throws java.io.UnsupportedEncodingException
|
||||||
|
{
|
||||||
|
this(dstream, encoding, startline, startcolumn, 4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor. */
|
||||||
|
public SimpleCharStream(java.io.InputStream dstream, int startline,
|
||||||
|
int startcolumn)
|
||||||
|
{
|
||||||
|
this(dstream, startline, startcolumn, 4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor. */
|
||||||
|
public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
|
||||||
|
{
|
||||||
|
this(dstream, encoding, 1, 1, 4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor. */
|
||||||
|
public SimpleCharStream(java.io.InputStream dstream)
|
||||||
|
{
|
||||||
|
this(dstream, 1, 1, 4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reinitialise. */
|
||||||
|
public void ReInit(java.io.InputStream dstream, String encoding, int startline,
|
||||||
|
int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
|
||||||
|
{
|
||||||
|
ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reinitialise. */
|
||||||
|
public void ReInit(java.io.InputStream dstream, int startline,
|
||||||
|
int startcolumn, int buffersize)
|
||||||
|
{
|
||||||
|
ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reinitialise. */
|
||||||
|
public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
|
||||||
|
{
|
||||||
|
ReInit(dstream, encoding, 1, 1, 4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reinitialise. */
|
||||||
|
public void ReInit(java.io.InputStream dstream)
|
||||||
|
{
|
||||||
|
ReInit(dstream, 1, 1, 4096);
|
||||||
|
}
|
||||||
|
/** Reinitialise. */
|
||||||
|
public void ReInit(java.io.InputStream dstream, String encoding, int startline,
|
||||||
|
int startcolumn) throws java.io.UnsupportedEncodingException
|
||||||
|
{
|
||||||
|
ReInit(dstream, encoding, startline, startcolumn, 4096);
|
||||||
|
}
|
||||||
|
/** Reinitialise. */
|
||||||
|
public void ReInit(java.io.InputStream dstream, int startline,
|
||||||
|
int startcolumn)
|
||||||
|
{
|
||||||
|
ReInit(dstream, startline, startcolumn, 4096);
|
||||||
|
}
|
||||||
|
/** Get token literal value. */
|
||||||
|
static public String GetImage()
|
||||||
|
{
|
||||||
|
if (bufpos >= tokenBegin)
|
||||||
|
return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
|
||||||
|
else
|
||||||
|
return new String(buffer, tokenBegin, bufsize - tokenBegin) +
|
||||||
|
new String(buffer, 0, bufpos + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get the suffix. */
|
||||||
|
static public char[] GetSuffix(int len)
|
||||||
|
{
|
||||||
|
char[] ret = new char[len];
|
||||||
|
|
||||||
|
if ((bufpos + 1) >= len)
|
||||||
|
System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
|
||||||
|
len - bufpos - 1);
|
||||||
|
System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reset buffer when finished. */
|
||||||
|
static public void Done()
|
||||||
|
{
|
||||||
|
buffer = null;
|
||||||
|
bufline = null;
|
||||||
|
bufcolumn = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to adjust line and column numbers for the start of a token.
|
||||||
|
*/
|
||||||
|
static public void adjustBeginLineColumn(int newLine, int newCol)
|
||||||
|
{
|
||||||
|
int start = tokenBegin;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if (bufpos >= tokenBegin)
|
||||||
|
{
|
||||||
|
len = bufpos - tokenBegin + inBuf + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
len = bufsize - tokenBegin + bufpos + 1 + inBuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i = 0, j = 0, k = 0;
|
||||||
|
int nextColDiff = 0, columnDiff = 0;
|
||||||
|
|
||||||
|
while (i < len &&
|
||||||
|
bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
|
||||||
|
{
|
||||||
|
bufline[j] = newLine;
|
||||||
|
nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
|
||||||
|
bufcolumn[j] = newCol + columnDiff;
|
||||||
|
columnDiff = nextColDiff;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < len)
|
||||||
|
{
|
||||||
|
bufline[j] = newLine++;
|
||||||
|
bufcolumn[j] = newCol + columnDiff;
|
||||||
|
|
||||||
|
while (i++ < len)
|
||||||
|
{
|
||||||
|
if (bufline[j = start % bufsize] != bufline[++start % bufsize])
|
||||||
|
bufline[j] = newLine++;
|
||||||
|
else
|
||||||
|
bufline[j] = newLine;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
line = bufline[j];
|
||||||
|
column = bufcolumn[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/* JavaCC - OriginalChecksum=4adcd3f1268ce432e9d4b7531b9662ad (do not edit this line) */
|
124
src/edu/utexas/cs345/jdblisp/parser/Token.java
Normal file
124
src/edu/utexas/cs345/jdblisp/parser/Token.java
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/* Generated By:JavaCC: Do not edit this line. Token.java Version 4.1 */
|
||||||
|
/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null */
|
||||||
|
package edu.utexas.cs345.jdblisp.parser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the input token stream.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Token {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An integer that describes the kind of this token. This numbering
|
||||||
|
* system is determined by JavaCCParser, and a table of these numbers is
|
||||||
|
* stored in the file ...Constants.java.
|
||||||
|
*/
|
||||||
|
public int kind;
|
||||||
|
|
||||||
|
/** The line number of the first character of this Token. */
|
||||||
|
public int beginLine;
|
||||||
|
/** The column number of the first character of this Token. */
|
||||||
|
public int beginColumn;
|
||||||
|
/** The line number of the last character of this Token. */
|
||||||
|
public int endLine;
|
||||||
|
/** The column number of the last character of this Token. */
|
||||||
|
public int endColumn;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The string image of the token.
|
||||||
|
*/
|
||||||
|
public String image;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A reference to the next regular (non-special) token from the input
|
||||||
|
* stream. If this is the last token from the input stream, or if the
|
||||||
|
* token manager has not read tokens beyond this one, this field is
|
||||||
|
* set to null. This is true only if this token is also a regular
|
||||||
|
* token. Otherwise, see below for a description of the contents of
|
||||||
|
* this field.
|
||||||
|
*/
|
||||||
|
public Token next;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This field is used to access special tokens that occur prior to this
|
||||||
|
* token, but after the immediately preceding regular (non-special) token.
|
||||||
|
* If there are no such special tokens, this field is set to null.
|
||||||
|
* When there are more than one such special token, this field refers
|
||||||
|
* to the last of these special tokens, which in turn refers to the next
|
||||||
|
* previous special token through its specialToken field, and so on
|
||||||
|
* until the first special token (whose specialToken field is null).
|
||||||
|
* The next fields of special tokens refer to other special tokens that
|
||||||
|
* immediately follow it (without an intervening regular token). If there
|
||||||
|
* is no such token, this field is null.
|
||||||
|
*/
|
||||||
|
public Token specialToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An optional attribute value of the Token.
|
||||||
|
* Tokens which are not used as syntactic sugar will often contain
|
||||||
|
* meaningful values that will be used later on by the compiler or
|
||||||
|
* interpreter. This attribute value is often different from the image.
|
||||||
|
* Any subclass of Token that actually wants to return a non-null value can
|
||||||
|
* override this method as appropriate.
|
||||||
|
*/
|
||||||
|
public Object getValue() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No-argument constructor
|
||||||
|
*/
|
||||||
|
public Token() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new token for the specified Image.
|
||||||
|
*/
|
||||||
|
public Token(int kind)
|
||||||
|
{
|
||||||
|
this(kind, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new token for the specified Image and Kind.
|
||||||
|
*/
|
||||||
|
public Token(int kind, String image)
|
||||||
|
{
|
||||||
|
this.kind = kind;
|
||||||
|
this.image = image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the image.
|
||||||
|
*/
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new Token object, by default. However, if you want, you
|
||||||
|
* can create and return subclass objects based on the value of ofKind.
|
||||||
|
* Simply add the cases to the switch for all those special cases.
|
||||||
|
* For example, if you have a subclass of Token called IDToken that
|
||||||
|
* you want to create if ofKind is ID, simply add something like :
|
||||||
|
*
|
||||||
|
* case MyParserConstants.ID : return new IDToken(ofKind, image);
|
||||||
|
*
|
||||||
|
* to the following switch statement. Then you can cast matchedToken
|
||||||
|
* variable to the appropriate type and use sit in your lexical actions.
|
||||||
|
*/
|
||||||
|
public static Token newToken(int ofKind, String image)
|
||||||
|
{
|
||||||
|
switch(ofKind)
|
||||||
|
{
|
||||||
|
default : return new Token(ofKind, image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Token newToken(int ofKind)
|
||||||
|
{
|
||||||
|
return newToken(ofKind, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/* JavaCC - OriginalChecksum=d28ecf56b256889a3fed2c9be26df91b (do not edit this line) */
|
141
src/edu/utexas/cs345/jdblisp/parser/TokenMgrError.java
Normal file
141
src/edu/utexas/cs345/jdblisp/parser/TokenMgrError.java
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 4.1 */
|
||||||
|
/* JavaCCOptions: */
|
||||||
|
package edu.utexas.cs345.jdblisp.parser;
|
||||||
|
|
||||||
|
/** Token Manager Error. */
|
||||||
|
@SuppressWarnings("serial")
|
||||||
|
public class TokenMgrError extends Error
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ordinals for various reasons why an Error of this type can be thrown.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lexical error occurred.
|
||||||
|
*/
|
||||||
|
static final int LEXICAL_ERROR = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An attempt was made to create a second instance of a static token manager.
|
||||||
|
*/
|
||||||
|
static final int STATIC_LEXER_ERROR = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tried to change to an invalid lexical state.
|
||||||
|
*/
|
||||||
|
static final int INVALID_LEXICAL_STATE = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detected (and bailed out of) an infinite loop in the token manager.
|
||||||
|
*/
|
||||||
|
static final int LOOP_DETECTED = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates the reason why the exception is thrown. It will have
|
||||||
|
* one of the above 4 values.
|
||||||
|
*/
|
||||||
|
int errorCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces unprintable characters by their escaped (or unicode escaped)
|
||||||
|
* equivalents in the given string
|
||||||
|
*/
|
||||||
|
protected static final String addEscapes(String str) {
|
||||||
|
StringBuffer retval = new StringBuffer();
|
||||||
|
char ch;
|
||||||
|
for (int i = 0; i < str.length(); i++) {
|
||||||
|
switch (str.charAt(i))
|
||||||
|
{
|
||||||
|
case 0 :
|
||||||
|
continue;
|
||||||
|
case '\b':
|
||||||
|
retval.append("\\b");
|
||||||
|
continue;
|
||||||
|
case '\t':
|
||||||
|
retval.append("\\t");
|
||||||
|
continue;
|
||||||
|
case '\n':
|
||||||
|
retval.append("\\n");
|
||||||
|
continue;
|
||||||
|
case '\f':
|
||||||
|
retval.append("\\f");
|
||||||
|
continue;
|
||||||
|
case '\r':
|
||||||
|
retval.append("\\r");
|
||||||
|
continue;
|
||||||
|
case '\"':
|
||||||
|
retval.append("\\\"");
|
||||||
|
continue;
|
||||||
|
case '\'':
|
||||||
|
retval.append("\\\'");
|
||||||
|
continue;
|
||||||
|
case '\\':
|
||||||
|
retval.append("\\\\");
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
|
||||||
|
String s = "0000" + Integer.toString(ch, 16);
|
||||||
|
retval.append("\\u" + s.substring(s.length() - 4, s.length()));
|
||||||
|
} else {
|
||||||
|
retval.append(ch);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retval.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a detailed message for the Error when it is thrown by the
|
||||||
|
* token manager to indicate a lexical error.
|
||||||
|
* Parameters :
|
||||||
|
* EOFSeen : indicates if EOF caused the lexical error
|
||||||
|
* curLexState : lexical state in which this error occurred
|
||||||
|
* errorLine : line number when the error occurred
|
||||||
|
* errorColumn : column number when the error occurred
|
||||||
|
* errorAfter : prefix that was seen before this error occurred
|
||||||
|
* curchar : the offending character
|
||||||
|
* Note: You can customize the lexical error message by modifying this method.
|
||||||
|
*/
|
||||||
|
protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
|
||||||
|
return("Lexical error at line " +
|
||||||
|
errorLine + ", column " +
|
||||||
|
errorColumn + ". Encountered: " +
|
||||||
|
(EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
|
||||||
|
"after : \"" + addEscapes(errorAfter) + "\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* You can also modify the body of this method to customize your error messages.
|
||||||
|
* For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
|
||||||
|
* of end-users concern, so you can return something like :
|
||||||
|
*
|
||||||
|
* "Internal Error : Please file a bug report .... "
|
||||||
|
*
|
||||||
|
* from this method for such cases in the release version of your parser.
|
||||||
|
*/
|
||||||
|
public String getMessage() {
|
||||||
|
return super.getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Constructors of various flavors follow.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** No arg constructor. */
|
||||||
|
public TokenMgrError() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Constructor with message and reason. */
|
||||||
|
public TokenMgrError(String message, int reason) {
|
||||||
|
super(message);
|
||||||
|
errorCode = reason;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Full Constructor. */
|
||||||
|
public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
|
||||||
|
this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* JavaCC - OriginalChecksum=388d16ceb49acdb4db62ae0c5dc59f76 (do not edit this line) */
|
Loading…
x
Reference in New Issue
Block a user