diff --git a/uppsrc/CppBase/CppBase.h b/uppsrc/CppBase/CppBase.h index f9eb60e02..25a77a30b 100644 --- a/uppsrc/CppBase/CppBase.h +++ b/uppsrc/CppBase/CppBase.h @@ -104,8 +104,11 @@ class Lex { void Next(); bool Prepare(int pos); int GetCharacter(); + void ThrowError(const char *e); public: + Callback1 WhenError; + struct Grounding {}; int Code(int pos = 0); @@ -392,6 +395,10 @@ class Parser { void Statement(); void Locals(const String& type); String Tparam(int& q); + + friend class Lex; // Fix to make Lex::ThrowError + + typedef Parser CLASSNAME; public: struct FunctionStat @@ -432,7 +439,7 @@ public: void Do(Stream& s, const Vector& ignore, CppBase& base, const String& fn, Callback2 err, const Vector& typenames = Vector()); - Parser() : dobody(false) {} + Parser() : dobody(false) { lex.WhenError = THISBACK(ThrowError); } }; String NoTemplatePars(const String& type); diff --git a/uppsrc/CppBase/cpplex.cpp b/uppsrc/CppBase/cpplex.cpp index 3ab3aec81..273341093 100644 --- a/uppsrc/CppBase/cpplex.cpp +++ b/uppsrc/CppBase/cpplex.cpp @@ -361,9 +361,16 @@ bool Lex::IsId(int pos) return Code(pos) >= endkey + 256; } +void Lex::ThrowError(const char *e) +{ + WhenError(e); + throw Parser::Error(); +} + String Lex::Id(int pos) { - ASSERT(IsId(pos)); + if(!IsId(pos)) + ThrowError("expected id"); return id[Code(pos) - 256]; } @@ -414,28 +421,32 @@ void Lex::SkipToGrounding() int Lex::Int(int pos) { Prepare(pos); - ASSERT(term[pos].code == t_integer); + if(term[pos].code != t_integer) + ThrowError("expected integer literal"); return (int)term[pos].number; } double Lex::Double(int pos) { Prepare(pos); - ASSERT(term[pos].code == t_double); + if(term[pos].code != t_double) + ThrowError("expected floating point literal"); return term[pos].number; } String Lex::Text(int pos) { Prepare(pos); - ASSERT(term[pos].code == t_string); + if(term[pos].code != t_string) + ThrowError("expected string literal"); return term[pos].text; } int Lex::Chr(int pos) { Prepare(pos); - ASSERT(term[pos].code == t_character); + if(term[pos].code != t_character) + ThrowError("expected character literal"); return (byte)*term[pos].text; }