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():
+{}
+{
+ "-" | | "#"
+}