I am trying to parse a lua code baed on Lua 5.1 grammar . I have tried to parse most things with much success, however when I try to parse an Identity
which begins with an uppercase character, I get an Unexpected
exception.
Called from ? line 1
Called from Main.hx line 14
Called from xlua/Parser.hx line 25
Called from hxparse/ParserBuilderImpl.hx line 112
Called from hxparse/Parser.hx line 36
Called from hxparse/LexerTokenSource.hx line 13
Called from xlua/Lexer.hx line 59
Called from hxparse/Lexer.hx line 100
Uncaught exception - Unexpected P
class Lexer extends hxparse.Lexer implements hxparse.RuleBuilder {
static function mkPos(p:hxparse.Position) {
return {
file: p.psource,
min: p.pmin,
max: p.pmax
};
}
static function mk(lexer:hxparse.Lexer, td) {
return new xlua.Data.Token(td, mkPos(lexer.curPos()));
}
// @:mapping generates a map with lowercase enum constructor names as keys
// and the constructor itself as value
static var keywords = @:mapping(3) Data.Keyword;
static var buf = new StringBuf();
static var ident = "_*[a-z][a-zA-Z0-9_]*|_+|_+[0-9][_a-zA-Z0-9]*";
static var integer = "([1-9][0-9]*)|0";
// @:rule wraps the expression to the right of => with function(lexer) return
public static var tok = @:rule [
"" => mk(lexer, Eof),
"[\r\n\t ]+" => {
#if keep_whitespace
var space = lexer.current;
var token:Token = lexer.token(tok);
token.space = space;
token;
#else
lexer.token(tok);
#end
},
"0x[0-9a-fA-F]+" => mk(lexer, Const(CInt(lexer.current))),
integer => mk(lexer, Const(CInt(lexer.current))),
integer + "\\.[0-9]+" => mk(lexer, Const(CFloat(lexer.current))),
"\\.[0-9]+" => mk(lexer, Const(CFloat(lexer.current))),
integer + "[eE][\\+\\-]?[0-9]+" => mk(lexer,Const(CFloat(lexer.current))),
integer + "\\.[0-9]*[eE][\\+\\-]?[0-9]+" => mk(lexer,Const(CFloat(lexer.current))),
"-- [^\n\r]*" => mk(lexer, CommentLine(lexer.current.substr(2))),
"+\\+" => mk(lexer,Unop(OpIncrement)),
"~" => mk(lexer,Unop(OpNegBits)),
"%=" => mk(lexer,Binop(OpAssignOp(OpMod))),
"&=" => mk(lexer,Binop(OpAssignOp(OpAnd))),
"|=" => mk(lexer,Binop(OpAssignOp(OpOr))),
"^=" => mk(lexer,Binop(OpAssignOp(OpXor))),
"+=" => mk(lexer,Binop(OpAssignOp(OpAdd))),
"-=" => mk(lexer,Binop(OpAssignOp(OpSub))),
"*=" => mk(lexer,Binop(OpAssignOp(OpMult))),
"/=" => mk(lexer,Binop(OpAssignOp(OpDiv))),
"<<=" => mk(lexer,Binop(OpAssignOp(OpShl))),
"==" => mk(lexer,Binop(OpEq)),
"~=" => mk(lexer,Binop(OpNotEq)),
"<=" => mk(lexer,Binop(OpLte)),
"and" => mk(lexer,Binop(OpBoolAnd)),
"or" => mk(lexer,Binop(OpBoolOr)),
"<<" => mk(lexer,Binop(OpShl)),
"\\.\\.\\." => mk(lexer, TriplDot),
"~" => mk(lexer,Unop(OpNot)),
"<" => mk(lexer,Binop(OpLt)),
">" => mk(lexer,Binop(OpGt)),
":" => mk(lexer, Col),
"," => mk(lexer, Comma),
"\\." => mk(lexer, Dot),
"%" => mk(lexer,Binop(OpMod)),
"&" => mk(lexer,Binop(OpAnd)),
"|" => mk(lexer,Binop(OpOr)),
"^" => mk(lexer,Binop(OpXor)),
"+" => mk(lexer,Binop(OpAdd)),
"*" => mk(lexer,Binop(OpMult)),
"/" => mk(lexer,Binop(OpDiv)),
"-" => mk(lexer,Binop(OpSub)),
"=" => mk(lexer,Binop(OpAssign)),
"in" => mk(lexer,Binop(OpIn)),
"[" => mk(lexer, BkOpen),
"]" => mk(lexer, BkClose),
"{" => mk(lexer, BrOpen),
"}" => mk(lexer, BrClose),
"\\(" => mk(lexer, POpen),
"\\)" => mk(lexer, PClose),
'"' => {
buf = new StringBuf();
var pmin = lexer.curPos();
var pmax = try lexer.token(string) catch (e:haxe.io.Eof) throw new LexerError(UnterminatedString, mkPos(pmin));
var token = mk(lexer, Const(CString(unescape(buf.toString(), mkPos(pmin)))));
token.pos.min = pmin.pmin; token;
},
"'" => {
buf = new StringBuf();
var pmin = lexer.curPos();
var pmax = try lexer.token(string2) catch (e:haxe.io.Eof) throw new LexerError(UnterminatedString, mkPos(pmin));
var token = mk(lexer, Const(CString(unescape(buf.toString(), mkPos(pmin)))));
token.pos.min = pmin.pmin; token;
},
'-- \\*' => {
buf = new StringBuf();
var pmin = lexer.curPos();
var pmax = try lexer.token(comment) catch (e:haxe.io.Eof) throw new LexerError(UnclosedComment, mkPos(pmin));
var token = mk(lexer, Comment(buf.toString()));
token.pos.min = pmin.pmin; token;
},
"#" + ident => mk(lexer, Sharp(lexer.current.substr(1))),
ident => {
var kwd = keywords.get(lexer.current);
if(kwd != null)
mk(lexer, Kwd(kwd));
else
mk(lexer, Const(CIdent(lexer.current)));
}
];
}
I would appreciate if you can help me figure out whatever I am doing wrongly.