Fun call parsing fixed, but parsing waaaaay slower

This commit is contained in:
Jonathan Turner 2009-06-27 20:59:43 +00:00
parent cb1706242e
commit 88e0d15efd

View File

@ -392,17 +392,25 @@ namespace langkit {
if (retval) { if (retval) {
Finish_Parse(Token_Type::Arg_List); Finish_Parse(Token_Type::Arg_List);
return true;
} }
else { else {
Fail_Parse(); Fail_Parse();
return false;
} }
return retval;
} }
bool Fun_Call() { bool Fun_Call() {
bool retval = false;
Start_Parse(); Start_Parse();
if (Id(true) && Char('(') && (Arg_List() || true) && Char(')')) { if (Id(true) && Char('(')) {
Arg_List();
retval = Char(')');
}
if (retval) {
Finish_Parse(Token_Type::Fun_Call); Finish_Parse(Token_Type::Fun_Call);
return true; return true;
} }
@ -429,6 +437,7 @@ namespace langkit {
return true; return true;
} }
else { else {
Fail_Parse();
return false; return false;
} }
} }
@ -450,6 +459,7 @@ namespace langkit {
return true; return true;
} }
else { else {
Fail_Parse();
return false; return false;
} }
} }
@ -462,6 +472,7 @@ namespace langkit {
return true; return true;
} }
else { else {
Fail_Parse();
return false; return false;
} }
} }
@ -471,18 +482,20 @@ namespace langkit {
Start_Parse(); Start_Parse();
if ( (retval = (Additive() && ((Str(">=", true) || Char('>', true) || Str("<=", true) || Char('<', true) || Str("==", true) || Str("!=", true))))) ) {
do {
retval = Additive(); retval = Additive();
while (retval && (Str(">=", true) || Char('>', true) || Str("<=", true) || Char('<', true) || Str("==", true) || Str("!=", true))) { } while (retval && ((Str(">=", true) || Char('>', true) || Str("<=", true) || Char('<', true) || Str("==", true) || Str("!=", true))));
retval = Additive();
} }
if (retval) { if (retval) {
Finish_Parse(Token_Type::Comparison); Finish_Parse(Token_Type::Comparison);
return true;
} }
else { else {
Fail_Parse(); Fail_Parse();
return Additive();
} }
return retval;
} }
bool Additive() { bool Additive() {
@ -490,18 +503,20 @@ namespace langkit {
Start_Parse(); Start_Parse();
if ( (retval = (Multiplicative() && (Char('+', true) || Char('-', true)))) ) {
do {
retval = Multiplicative(); retval = Multiplicative();
while (retval && (Char('+', true) || Char('-', true))) { } while (retval && (Char('+', true) || Char('-', true)));
retval = Multiplicative();
} }
if (retval) { if (retval) {
Finish_Parse(Token_Type::Additive); Finish_Parse(Token_Type::Additive);
return true;
} }
else { else {
Fail_Parse(); Fail_Parse();
return Multiplicative();
} }
return retval;
} }
bool Multiplicative() { bool Multiplicative() {
@ -509,26 +524,20 @@ namespace langkit {
Start_Parse(); Start_Parse();
if ( (retval = (Value() && (Char('*', true) || Char('/', true)))) ) {
do {
retval = Value(); retval = Value();
while (retval && (Char('*', true) || Char('/', true))) { } while (retval && (Char('*', true) || Char('/', true)));
retval = Value();
} }
if (retval) { if (retval) {
Finish_Parse(Token_Type::Multiplicative); Finish_Parse(Token_Type::Multiplicative);
return true;
} }
else { else {
Fail_Parse(); Fail_Parse();
return Value();
} }
/*
* The above can be shortened to this, but let's not get carried away :)
if (!(Start_Parse() && Id(true) && Char('(') && (Arg_List() || true) && Char(')') && Finish_Parse(Token_Type::Fun_Call))) {
Fail_Parse();
}
*/
return retval;
} }
bool Expression() { bool Expression() {
@ -536,29 +545,40 @@ namespace langkit {
Start_Parse(); Start_Parse();
if ( (retval = (Comparison() && (Str("&&", true) || Str("||", true)))) ) {
do {
retval = Comparison(); retval = Comparison();
while (retval && (Str("&&", true) || Str("||", true))) { } while (retval && (Str("&&", true) || Str("||", true)));
retval = Comparison();
} }
if (retval) { if (retval) {
Finish_Parse(Token_Type::Expression); Finish_Parse(Token_Type::Expression);
return true;
} }
else { else {
Fail_Parse(); Fail_Parse();
return Comparison();
} }
return retval;
} }
bool Equation() { bool Equation() {
bool retval;
Start_Parse(); Start_Parse();
if (LHS() && Char('=') && Expression()) {
if ( (retval = (Expression() && (Char('=', true)))) ) {
do {
retval = Expression();
} while (retval && (Char('=', true)));
}
if (retval) {
Finish_Parse(Token_Type::Equation); Finish_Parse(Token_Type::Equation);
return true; return true;
} }
else { else {
Fail_Parse(); Fail_Parse();
return false; return Expression();
} }
} }