/** * Javacc grammar for lua language version 5.2 * * 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.2/ * * Empty grammar that validates syntax without producing a parse tree. * * @author Jim Roseborough * @date August 30, 2012 */ options { STATIC = false; JDK_VERSION = "1.8"; 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: ()? > | < #FNUM: ()+ "." ()* | "." ()+ | ()+ > | < #DIGIT: ["0"-"9"] > | < #EXP: ["e","E"] (["+","-"])? ()+ > | < #HEX: "0" ["x","X"] ()? > | < #HEXNUM: ()+ "." ()* | "." ()+ | ()+ > | < #HEXDIGIT: ["0"-"9","a"-"f","A"-"F"] > | < #HEXEXP: ["e","E","p","P"] (["+","-"])? ()+ > | < STRING: "\"" ( | ~["\\","\""])* "\"" > | < CHARSTRING: "'" ( | ~["\\","'"])* "'" > | < #QUOTED: | | > | < #DECIMAL: "\\" ["0"-"9"] (["0"-"9"])? (["0"-"9"])? > | < DBCOLON: "::" > | < #UNICODE: "\\" "u" > | < #CHAR: "\\" (~[]) > | < #LF: ("\n" | "\r" | "\r\n") > } /** Root production. */ void Chunk(): {} { ( "#" { token_source.SwitchTo(IN_COMMENT); } )? Block() } void Block(): {} { ( Stat() )* ( ReturnStat() )? } void Stat(): {} { ";" | Label() | | | 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 ReturnStat(): {} { ( ExpList() )? ( ";" )? } void Label(): {} { } 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() | FunctionCall() | PrimaryExp() } void Str(): {} { | | | | | | } void Exp(): {} { SubExp() } void SubExp(): {} { ( SimpleExp() | Unop() SubExp() ) (LOOKAHEAD(2) Binop() SubExp())* } void FunctionCall(): {} { 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(): {} { "-" | | "#" }