Update of /cvsroot/jrman/drafts/javacc In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16408/javacc Modified Files: SLParser.jj Added Files: JavaCharStream.java ParseException.java SLParser.java SLParserConstants.java SLParserTokenManager.java Token.java TokenMgrError.java Log Message: Finished parsing SL grammar, now it parses the .sl examples in sampleData and sampleData/sl except MondoMetal.sl (I found a little bug). I will add the preprocessor soon. --- NEW FILE: JavaCharStream.java --- /* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 3.0 */ /** * An implementation of interface CharStream, where the stream is assumed to * contain only ASCII characters (with java-like unicode escape processing). */ public class JavaCharStream { public static final boolean staticFlag = true; static final int hexval(char c) throws java.io.IOException { switch(c) { case '0' : return 0; case '1' : return 1; case '2' : return 2; case '3' : return 3; case '4' : return 4; case '5' : return 5; case '6' : return 6; case '7' : return 7; case '8' : return 8; case '9' : return 9; case 'a' : case 'A' : return 10; case 'b' : case 'B' : return 11; case 'c' : case 'C' : return 12; case 'd' : case 'D' : return 13; case 'e' : case 'E' : return 14; case 'f' : case 'F' : return 15; } throw new java.io.IOException(); // Should never come here } static public int bufpos = -1; static int bufsize; static int available; static int tokenBegin; 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[] nextCharBuf; static protected char[] buffer; static protected int maxNextCharInd = 0; static protected int nextCharInd = -1; static protected int inBuf = 0; 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; 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; bufpos -= tokenBegin; } } catch (Throwable t) { throw new Error(t.getMessage()); } available = (bufsize += 2048); tokenBegin = 0; } static protected void FillBuff() throws java.io.IOException { int i; if (maxNextCharInd == 4096) maxNextCharInd = nextCharInd = 0; try { if ((i = inputStream.read(nextCharBuf, maxNextCharInd, 4096 - maxNextCharInd)) == -1) { inputStream.close(); throw new java.io.IOException(); } else maxNextCharInd += i; return; } catch(java.io.IOException e) { if (bufpos != 0) { --bufpos; backup(0); } else { bufline[bufpos] = line; bufcolumn[bufpos] = column; } throw e; } } static protected char ReadByte() throws java.io.IOException { if (++nextCharInd >= maxNextCharInd) FillBuff(); return nextCharBuf[nextCharInd]; } static public char BeginToken() throws java.io.IOException { if (inBuf > 0) { --inBuf; if (++bufpos == bufsize) bufpos = 0; tokenBegin = bufpos; return buffer[bufpos]; } tokenBegin = 0; bufpos = -1; return readChar(); } static protected void AdjustBuffSize() { if (available == bufsize) { if (tokenBegin > 2048) { bufpos = 0; available = tokenBegin; } else ExpandBuff(false); } else if (available > tokenBegin) available = bufsize; else if ((tokenBegin - available) < 2048) ExpandBuff(true); else available = tokenBegin; } 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 += (8 - (column & 07)); break; default : break; } bufline[bufpos] = line; bufcolumn[bufpos] = column; } static public char readChar() throws java.io.IOException { if (inBuf > 0) { --inBuf; if (++bufpos == bufsize) bufpos = 0; return buffer[bufpos]; } char c; if (++bufpos == available) AdjustBuffSize(); if ((buffer[bufpos] = c = ReadByte()) == '\\') { UpdateLineColumn(c); int backSlashCnt = 1; for (;;) // Read all the backslashes { if (++bufpos == available) AdjustBuffSize(); try { if ((buffer[bufpos] = c = ReadByte()) != '\\') { UpdateLineColumn(c); // found a non-backslash char. if ((c == 'u') && ((backSlashCnt & 1) == 1)) { if (--bufpos < 0) bufpos = bufsize - 1; break; } backup(backSlashCnt); return '\\'; } } catch(java.io.IOException e) { if (backSlashCnt > 1) backup(backSlashCnt); return '\\'; } UpdateLineColumn(c); backSlashCnt++; } // Here, we have seen an odd number of backslash's followed by a 'u' try { while ((c = ReadByte()) == 'u') ++column; buffer[bufpos] = c = (char)(hexval(c) << 12 | hexval(ReadByte()) << 8 | hexval(ReadByte()) << 4 | hexval(ReadByte())); column += 4; } catch(java.io.IOException e) { throw new Error("Invalid escape character at line " + line + " column " + column + "."); } if (backSlashCnt == 1) return c; else { backup(backSlashCnt - 1); return '\\'; } } else { UpdateLineColumn(c); return (c); } } /** * @deprecated * @see #getEndColumn */ static public int getColumn() { return bufcolumn[bufpos]; } /** * @deprecated * @see #getEndLine */ static public int getLine() { return bufline[bufpos]; } static public int getEndColumn() { return bufcolumn[bufpos]; } static public int getEndLine() { return bufline[bufpos]; } static public int getBeginColumn() { return bufcolumn[tokenBegin]; } static public int getBeginLine() { return bufline[tokenBegin]; } static public void backup(int amount) { inBuf += amount; if ((bufpos -= amount) < 0) bufpos += bufsize; } public JavaCharStream(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 JavaCharStream. You must\n" + " 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]; nextCharBuf = new char[4096]; } public JavaCharStream(java.io.Reader dstream, int startline, int startcolumn) { this(dstream, startline, startcolumn, 4096); } public JavaCharStream(java.io.Reader dstream) { this(dstream, 1, 1, 4096); } 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]; nextCharBuf = new char[4096]; } prevCharIsLF = prevCharIsCR = false; tokenBegin = inBuf = maxNextCharInd = 0; nextCharInd = bufpos = -1; } public void ReInit(java.io.Reader dstream, int startline, int startcolumn) { ReInit(dstream, startline, startcolumn, 4096); } public void ReInit(java.io.Reader dstream) { ReInit(dstream, 1, 1, 4096); } public JavaCharStream(java.io.InputStream dstream, int startline, int startcolumn, int buffersize) { this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096); } public JavaCharStream(java.io.InputStream dstream, int startline, int startcolumn) { this(dstream, startline, startcolumn, 4096); } public JavaCharStream(java.io.InputStream dstream) { this(dstream, 1, 1, 4096); } public void ReInit(java.io.InputStream dstream, int startline, int startcolumn, int buffersize) { ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096); } public void ReInit(java.io.InputStream dstream, int startline, int startcolumn) { ReInit(dstream, startline, startcolumn, 4096); } public void ReInit(java.io.InputStream dstream) { ReInit(dstream, 1, 1, 4096); } 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); } 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; } static public void Done() { nextCharBuf = null; 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]; } } --- NEW FILE: ParseException.java --- /* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */ /** * 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; } 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(); } String expected = ""; 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 += tokenImage[expectedTokenSequences[i][j]] + " "; } if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { expected += "..."; } expected += eol + " "; } 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 += add_escapes(tok.image); 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; 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(); } } --- NEW FILE: SLParser.java --- /* Generated By:JavaCC: Do not edit this line. SLParser.java */ import java.io.FileInputStream; import java.io.IOException; public class SLParser implements SLParserConstants { public static void main(String args[]) throws ParseException, IOException { if (args.length == 0) { SLParser parser = new SLParser(System.in); parser.compilationUnit(); } else if (args.length == 1) { String filename = args[0]; SLParser parser = new SLParser(new FileInputStream(filename)); parser.compilationUnit(); } [...2500 lines suppressed...] jj_rescan = false; } static final private void jj_save(int index, int xla) { JJCalls p = jj_2_rtns[index]; while (p.gen > jj_gen) { if (p.next == null) { p = p.next = new JJCalls(); break; } p = p.next; } p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla; } static final class JJCalls { int gen; Token first; int arg; JJCalls next; } } --- NEW FILE: SLParserConstants.java --- /* Generated By:JavaCC: Do not edit this line. SLParserConstants.java */ public interface SLParserConstants { int EOF = 0; int SINGLE_LINE_COMMENT = 11; int MULTI_LINE_COMMENT = 12; int LIGHT = 14; int SURFACE = 15; int VOLUME = 16; int DISPLACEMENT = 17; int IMAGER = 18; int FLOAT = 19; int STRING = 20; int COLOR = 21; int POINT = 22; int VECTOR = 23; int NORMAL = 24; int MATRIX = 25; int VOID = 26; int OUTPUT = 27; int VARYING = 28; int UNIFORM = 29; int TEXTURE = 30; int ENVIRONMENT = 31; int SHADOW = 32; int RETURN = 33; int EXTERN = 34; int BREAK = 35; int CONTINUE = 36; int IF = 37; int ELSE = 38; int WHILE = 39; int FOR = 40; int SOLAR = 41; int ILLUMINATE = 42; int ILLUMINANCE = 43; int INTEGER_LITERAL = 44; int DECIMAL_LITERAL = 45; int HEX_LITERAL = 46; int OCTAL_LITERAL = 47; int FLOATING_POINT_LITERAL = 48; int EXPONENT = 49; int CHARACTER_LITERAL = 50; int STRING_LITERAL = 51; int IDENTIFIER = 52; int LETTER = 53; int DIGIT = 54; int LPAREN = 55; int RPAREN = 56; int LBRACE = 57; int RBRACE = 58; int LBRACKET = 59; int RBRACKET = 60; int SEMICOLON = 61; int COMMA = 62; int PLUS = 63; int MINUS = 64; int STAR = 65; int SLASH = 66; int EXP = 67; int BANG = 68; int ASSIGN = 69; int HOOK = 70; int PLUSASSIGN = 71; int MINUSASSIGN = 72; int STARASSIGN = 73; int SLASHASSIGN = 74; int COLON = 75; int DOT = 76; int DEFAULT = 0; int PREPROCESSOR_OUTPUT = 1; int IN_SINGLE_LINE_COMMENT = 2; int IN_MULTI_LINE_COMMENT = 3; String[] tokenImage = { "<EOF>", "\" \"", "\"\\t\"", "\"\\n\"", "\"\\r\"", "\"\\f\"", "\"#\"", "\"\\n\"", "<token of kind 8>", "\"//\"", "\"/*\"", "<SINGLE_LINE_COMMENT>", "\"*/\"", "<token of kind 13>", "\"light\"", "\"surface\"", "\"volume\"", "\"displacement\"", "\"imager\"", "\"float\"", "\"string\"", "\"color\"", "\"point\"", "\"vector\"", "\"normal\"", "\"matrix\"", "\"void\"", "\"output\"", "\"varying\"", "\"uniform\"", "\"texture\"", "\"environment\"", "\"shadow\"", "\"return\"", "\"extern\"", "\"break\"", "\"continue\"", "\"if\"", "\"else\"", "\"while\"", "\"for\"", "\"solar\"", "\"illuminate\"", "\"illuminance\"", "<INTEGER_LITERAL>", "<DECIMAL_LITERAL>", "<HEX_LITERAL>", "<OCTAL_LITERAL>", "<FLOATING_POINT_LITERAL>", "<EXPONENT>", "<CHARACTER_LITERAL>", "<STRING_LITERAL>", "<IDENTIFIER>", "<LETTER>", "<DIGIT>", "\"(\"", "\")\"", "\"{\"", "\"}\"", "\"[\"", "\"]\"", "\";\"", "\",\"", "\"+\"", "\"-\"", "\"*\"", "\"/\"", "\"^\"", "\"!\"", "\"=\"", "\"?\"", "\"+=\"", "\"-=\"", "\"*=\"", "\"/=\"", "\":\"", "\".\"", "\"||\"", "\"&&\"", "\"==\"", "\"!=\"", "\"<\"", "\">\"", "\"<=\"", "\">=\"", }; } --- NEW FILE: SLParserTokenManager.java --- /* Generated By:JavaCC: Do not edit this line. SLParserTokenManager.java */ import java.io.FileInputStream; import java.io.IOException; public class SLParserTokenManager implements SLParserConstants { public static java.io.PrintStream debugStream = System.out; public static void setDebugStream(java.io.PrintStream ds) { debugStream = ds; } private static final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) { switch (pos) { case 0: if ((active1 & 0x1000L) != 0L) return 4; if ((active0 & 0xfffffffc000L) != 0L) { jjmatchedKind = 52; return 28; [...1455 lines suppressed...] 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 void SkipLexicalActions(Token matchedToken) { switch(jjmatchedKind) { default : break; } } } --- NEW FILE: Token.java --- /* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */ /** * 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; /** * beginLine and beginColumn describe the position of the first character * of this token; endLine and endColumn describe the position of the * last character of this token. */ public int beginLine, beginColumn, endLine, 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; /** * 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, simlpy add something like : * * case MyParserConstants.ID : return new IDToken(); * * to the following switch statement. Then you can cast matchedToken * variable to the appropriate type and use it in your lexical actions. */ public static final Token newToken(int ofKind) { switch(ofKind) { default : return new Token(); } } } --- NEW FILE: TokenMgrError.java --- /* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */ public class TokenMgrError extends Error { /* * Ordinals for various reasons why an Error of this type can be thrown. */ /** * Lexical error occured. */ static final int LEXICAL_ERROR = 0; /** * An attempt wass 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 espaced (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 lexicl error * curLexState : lexical state in which this error occured * errorLine : line number when the error occured * errorColumn : column number when the error occured * errorAfter : prefix that was seen before this error occured * 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. */ public TokenMgrError() { } public TokenMgrError(String message, int reason) { super(message); errorCode = reason; } 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); } } Index: SLParser.jj =================================================================== RCS file: /cvsroot/jrman/drafts/javacc/SLParser.jj,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** SLParser.jj 29 Sep 2003 12:07:59 -0000 1.3 --- SLParser.jj 2 Feb 2004 05:45:30 -0000 1.4 *************** *** 1,5 **** /* SLParser.jj ! Copyright (C) 2003 Elmer Garduno Hernandez This program is free software; you can redistribute it and/or --- 1,5 ---- /* SLParser.jj ! Copyright (C) 2004 Elmer Garduno Hernandez This program is free software; you can redistribute it and/or *************** *** 58,61 **** --- 58,73 ---- | "\r" | "\f" + | "#" : PREPROCESSOR_OUTPUT + + } + + <PREPROCESSOR_OUTPUT> SKIP: + { + "\n" : DEFAULT + } + + <PREPROCESSOR_OUTPUT> MORE: + { + < ~[] > } *************** *** 111,114 **** --- 123,135 ---- | < RETURN: "return" > | < EXTERN: "extern" > + | < BREAK: "break" > + | < CONTINUE: "continue" > + | < IF: "if" > + | < ELSE: "else" > + | < WHILE: "while" > + | < FOR: "for" > + | < SOLAR: "solar" > + | < ILLUMINATE: "illuminate" > + | < ILLUMINANCE: "illuminance" > } *************** *** 261,265 **** {} { ! shaderType() identifier() "("[formals()]")" "{" statements() "}" } --- 282,286 ---- {} { ! shaderType() identifier() "("[formals()]")" block() } *************** *** 267,271 **** {} { ! [type()] identifier() "("[formals()]")" "{" statements() "}" } --- 288,292 ---- {} { ! [type()] identifier() "("[formals()]")" block() } *************** *** 291,295 **** {} { ! formalVariableDefinitions() (";" formalVariableDefinitions() )* } --- 312,316 ---- {} { ! formalVariableDefinitions() [";"] (LOOKAHEAD(2) formalVariableDefinitions() ";")* } *************** *** 339,354 **** {} { ! LOOKAHEAD(3) primary() ! /* | ! typecast() expression()*/ ! | ! conditionalExpression() ! /*| ! expression() binop() expression() ! | ! "-" expression() | ! relation() "?" expression() ":" expression() ! */ } --- 360,367 ---- {} { ! LOOKAHEAD(3) conditionalExpression() | ! primary() ! } *************** *** 363,372 **** | LOOKAHEAD(2) procedurecall() - | - LOOKAHEAD(2) identifier() | ! LOOKAHEAD(2) identifier() [LOOKAHEAD(2) arrayindex()] | ! assignexpression() | LOOKAHEAD(3) triple() --- 376,384 ---- | LOOKAHEAD(2) procedurecall() | ! LOOKAHEAD(2) identifier() [LOOKAHEAD(2) arrayindex()] [asgnop() expression()] ! //assignExpression(), identifier() | ! LOOKAHEAD(3) single() | LOOKAHEAD(3) triple() *************** *** 453,456 **** --- 465,474 ---- } + void single(): + {} + { + "("expression()")" + } + void triple(): {} *************** *** 548,573 **** "!" unaryExpression() | primary() } ! void statements(): {} { ! (statement())+ } - - void statement(): {} { ! variableDefinitions() ";" | LOOKAHEAD(2) assignexpression() ";" | procedurecall() ";" | <RETURN> expression() ";" ! } --- 566,684 ---- "!" unaryExpression() | + castExpression() + | primary() } ! void castExpression() : {} { ! typecast() unaryExpression() } void statement(): {} { ! block() | LOOKAHEAD(2) assignexpression() ";" | + variableDefinitions() ";" + | procedurecall() ";" | <RETURN> expression() ";" ! | ! loopModStmt() ! | ! ifStatement() ! | ! loopControl() ! } ! ! void loopModStmt(): ! {} ! { ! loopMod() [<INTEGER_LITERAL>] ! } ! ! void loopMod(): ! {} ! { ! <BREAK>|<CONTINUE> ! } ! ! void ifStatement(): ! {} ! { ! <IF> "(" booleanExpression() ")" statement() [ LOOKAHEAD(2) <ELSE> statement() ] ! } ! ! void booleanExpression(): ! {} ! { ! expression() ! } ! ! void loopControl(): ! {} ! { ! whileStatement() ! | ! forStatement() ! | ! solarStatement() ! | ! illuminateStatement() ! | ! illuminanceStatement() ! } ! ! void whileStatement(): ! {} ! { ! <WHILE> "(" booleanExpression() ")" statement() ! } ! ! void forStatement(): ! {} ! { ! <FOR> "(" forInit() ";" booleanExpression() ";" forUpdate() ")" statement() ! } ! ! void forInit(): ! {} ! { ! expression() ! } ! ! void forUpdate(): ! {} ! { ! expression() ! } ! ! void solarStatement(): ! {} ! { ! <SOLAR> "(" [expressionList()] ")" statement() ! } ! ! void illuminateStatement(): ! {} ! { ! <ILLUMINATE> "(" [expressionList()] ")" statement() ! } ! ! void illuminanceStatement(): ! {} ! { ! <ILLUMINANCE> "(" [expressionList()] ")" statement() ! } ! ! void expressionList(): ! {} ! { ! expression() ("," expression())* } *************** *** 575,579 **** {} { ! [externspec()] typespec() defExpressions() ";" } --- 686,690 ---- {} { ! [externspec()] typespec() defExpressions() } *************** *** 585,586 **** --- 696,712 ---- } + void block() : + {} + { + "{" ( blockStatement() )* "}" + } + + void blockStatement() : + {} + { + LOOKAHEAD(3) formals() + | + statement() + } + + |