diff --git a/build.xml b/build.xml index fbc10afb..3219fe74 100644 --- a/build.xml +++ b/build.xml @@ -17,6 +17,7 @@ + @@ -41,6 +42,24 @@ + + + + + + + + + + + + + + + + + diff --git a/grammar/Lua51.jj b/grammar/Lua51.jj new file mode 100644 index 00000000..5268857f --- /dev/null +++ b/grammar/Lua51.jj @@ -0,0 +1,349 @@ +/** +* Javacc grammer for lua language version 5.1 +* +* Originally created for use in luaj, a Java implementation of the lua language +* @see http://sourceforge.net/projects/luaj/ +* +* For documentation on the lua language +* @see http://www.lua.org/manual/5.1/ +* +* Empty grammar that validates syntax without producing a parse tree. +* +* @author Jim Roseborough +* @date June 19, 2010 +*/ + +options { + STATIC = false; + JDK_VERSION = "1.3"; + ERROR_REPORTING = false; + DEBUG_LOOKAHEAD = false; + DEBUG_PARSER = false; + DEBUG_TOKEN_MANAGER = false; + OUTPUT_DIRECTORY = "org/luaj/vm2/parser"; +} + +PARSER_BEGIN(LuaParser) +package org.luaj.vm2.parser; + +public class LuaParser { + + public static void main(String args[]) throws ParseException { + LuaParser parser = new LuaParser(System.in); + parser.Chunk(); + } + + public static final int VAR = 0; + public static final int CALL = 1; +} + +PARSER_END(LuaParser) + +/* WHITE SPACE */ + +SKIP : +{ + " " | "\t" | "\n" | "\r" | "\f" +} + +/* COMMENTS and LONG STRINGS */ + +MORE : +{ + "--[[": IN_LC0 +| "--[=[": IN_LC1 +| "--[==[": IN_LC2 +| "--[===[": IN_LC3 +| < "--[====" ("=")* "[" > : IN_LCN +| "[[" : IN_LS0 +| "[=[" : IN_LS1 +| "[==[" : IN_LS2 +| "[===[" : IN_LS3 +| < "[====" ("=")* "[" > : IN_LSN +| "--" : IN_COMMENT +} + + SPECIAL_TOKEN : +{ + : DEFAULT +} + + SPECIAL_TOKEN : { : DEFAULT } + SPECIAL_TOKEN : { : DEFAULT } + SPECIAL_TOKEN : { : DEFAULT } + SPECIAL_TOKEN : { : DEFAULT } + SPECIAL_TOKEN : { : DEFAULT } + + TOKEN : { : DEFAULT } + TOKEN : { : DEFAULT } + TOKEN : { : DEFAULT } + TOKEN : { : DEFAULT } + TOKEN : { : DEFAULT } + + MORE : +{ + < ~[] > +} + + +/* RESERVED WORDS AND LITERALS */ + +TOKEN : +{ + +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +} + +/* LITERALS */ + +TOKEN : +{ + < NAME: ["a"-"z", "A"-"Z", "_"] (["a"-"z", "A"-"Z", "_", "0"-"9"])* > +| < NUMBER: | > +| < #FLOAT: ()+ "." ()* ()? | "." ()+ ()? | ()+ ()? > +| < #DIGIT: ["0"-"9"] > +| < #EXP: ["e","E"] (["+","-"])? ()+ > +| < #HEX: "0" ["x","X"] ()+ > +| < #HEXDIGIT: ["0"-"9","a"-"f","A"-"F"] > +| < STRING: "\"" ( | ~["\\","\""])* "\"" > +| < CHARSTRING: "'" ( | ~["\\","'"])* "'" > +| < #QUOTED: | | > +| < #DECIMAL: "\\" ["0"-"9"] (["0"-"9"])? (["0"-"9"])? > +| < #UNICODE: "\\" "u" > +//| < #CHAR: "\\" ("a"|"b"|"f"|"n"|"r"|"t"|"v"|"["|"]"|"'"|"\""|"\\"|"0"|) > +| < #CHAR: "\\" (~[]) > +| < #LF: ("\n" | "\r" | "\r\n") > +} + +/** Root production. */ +void Chunk(): +{} +{ + Block() +} + +void Block(): +{} +{ + (Stat() (";")? )* (LastStat() (";")? )? +} + +void Stat(): +{} +{ + Block() +| Exp() Block() +| Block() Exp() +| Exp() Block() ( Exp() Block())* ( Block())? +| LOOKAHEAD(3) "=" Exp() "," Exp() ( "," Exp() )? Block() +| NameList() ExpList() Block() +| FuncName() FuncBody() +| LOOKAHEAD(2) FuncBody() +| NameList() ( "=" ExpList() )? +| ExprStat() +} + +void LastStat(): +{} +{ + | ( ExpList() )? +} + +void ExprStat(): +{ int type,need=CALL; } +{ + type=PrimaryExp() ( Assign() { need=VAR; } )? + { if ( type!=need ) throw new ParseException("expected function call or assignment"); } +} + +void Assign(): +{} +{ + ( "," VarExp() )* "=" ExpList() +} + +void VarExp(): +{ int type; } +{ + type=PrimaryExp() + { if ( type!=VAR ) throw new ParseException("expected variable expression"); } +} + +void FuncName(): +{} +{ + ( "." )* ( ":" )? +} + +void PrefixExp(): +{} +{ + +| ParenExp() +} + +void ParenExp(): +{} +{ + "(" Exp() ")" +} + +int PrimaryExp(): +{ int type=VAR; } +{ + PrefixExp() ( LOOKAHEAD(2) type=PostfixOp() )* { return type; } +} + +int PostfixOp(): +{} +{ + FieldOp() { return VAR; } +| FuncOp() { return CALL; } +} + +void FieldOp(): +{} +{ + "." +| "[" Exp() "]" +} + +void FuncOp(): +{} +{ + ":" FuncArgs() +| FuncArgs() +} + +void FuncArgs(): +{} +{ + "(" ( ExpList() )? ")" +| TableConstructor() +| Str() +} + +void NameList(): +{} +{ + ( LOOKAHEAD(2) "," )* +} + +void ExpList(): +{} +{ + Exp() ( "," Exp() )* +} + +void SimpleExp(): +{} +{ + +| +| +| +| Str() +| "..." +| TableConstructor() +| Function() +| PrimaryExp() +} + +void Str(): +{} +{ + +| +| +| +| +| +| +} + +void Exp(): +{} +{ + SubExp() +} + +void SubExp(): +{} +{ + ( SimpleExp() | Unop() SubExp() ) (LOOKAHEAD(2) Binop() SubExp())* +} + +void Function(): +{} +{ + FuncBody() +} + +void FuncBody(): +{} +{ + "(" ( ParList() )? ")" Block() +} + +void ParList(): +{} +{ + NameList() ( "," "..." )? | "..." +} + +void TableConstructor(): +{} +{ + "{" ( FieldList() )? "}" +} + +void FieldList(): +{} +{ + Field() (LOOKAHEAD(2) FieldSep() Field())* (FieldSep())? +} + +void Field(): +{} +{ + "[" Exp() "]" "=" Exp() +| LOOKAHEAD(2) "=" Exp() +| Exp() +} + +void FieldSep(): +{} +{ + "," | ";" +} + +void Binop(): +{} +{ + "+" | "-" | "*" | "/" | "^" | "%" | ".." | "<" | "<=" | ">" | ">=" | "==" | "~=" | | +} + +void Unop(): +{} +{ + "-" | | "#" +}