mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 17:47:44 +00:00
JSSpecCompiler: Issue meaningful errors in TextParser
This commit is contained in:
parent
dee4978d67
commit
6b30c4d2f0
5 changed files with 272 additions and 147 deletions
|
@ -20,38 +20,38 @@ constexpr i32 closing_bracket_precedence = 18;
|
|||
|
||||
// NOTE: Operator precedence is generally the same as in
|
||||
// https://en.cppreference.com/w/cpp/language/operator_precedence (common sense applies).
|
||||
#define ENUMERATE_TOKENS(F) \
|
||||
F(Invalid, -1, Invalid, Invalid, Invalid) \
|
||||
F(SectionNumber, -1, Invalid, Invalid, Invalid) \
|
||||
F(Identifier, -1, Invalid, Invalid, Invalid) \
|
||||
F(Number, -1, Invalid, Invalid, Invalid) \
|
||||
F(String, -1, Invalid, Invalid, Invalid) \
|
||||
F(Undefined, -1, Invalid, Invalid, Invalid) \
|
||||
F(Word, -1, Invalid, Invalid, Invalid) \
|
||||
F(ParenOpen, -1, Invalid, Invalid, ParenClose) \
|
||||
F(ParenClose, 18, Invalid, Invalid, ParenOpen) \
|
||||
F(BraceOpen, -1, Invalid, Invalid, BraceClose) \
|
||||
F(BraceClose, 18, Invalid, Invalid, BraceOpen) \
|
||||
F(Comma, 17, Invalid, Comma, Invalid) \
|
||||
F(MemberAccess, 2, Invalid, MemberAccess, Invalid) \
|
||||
F(Dot, -1, Invalid, Invalid, Invalid) \
|
||||
F(Colon, -1, Invalid, Invalid, Invalid) \
|
||||
F(Less, 9, Invalid, CompareLess, Invalid) \
|
||||
F(Greater, 9, Invalid, CompareGreater, Invalid) \
|
||||
F(NotEquals, 10, Invalid, CompareNotEqual, Invalid) \
|
||||
F(Equals, 10, Invalid, CompareEqual, Invalid) \
|
||||
F(Plus, 6, Invalid, Plus, Invalid) \
|
||||
F(AmbiguousMinus, -2, Invalid, Invalid, Invalid) \
|
||||
F(UnaryMinus, 3, Minus, Invalid, Invalid) \
|
||||
F(BinaryMinus, 6, Invalid, Minus, Invalid) \
|
||||
F(Multiplication, 5, Invalid, Multiplication, Invalid) \
|
||||
F(Division, 5, Invalid, Division, Invalid) \
|
||||
F(FunctionCall, 2, Invalid, FunctionCall, Invalid) \
|
||||
F(ExclamationMark, 3, AssertCompletion, Invalid, Invalid) \
|
||||
F(Is, -1, Invalid, Invalid, Invalid)
|
||||
#define ENUMERATE_TOKENS(F) \
|
||||
F(Invalid, -1, Invalid, Invalid, Invalid, "") \
|
||||
F(SectionNumber, -1, Invalid, Invalid, Invalid, "section number") \
|
||||
F(Identifier, -1, Invalid, Invalid, Invalid, "identifier") \
|
||||
F(Number, -1, Invalid, Invalid, Invalid, "number") \
|
||||
F(String, -1, Invalid, Invalid, Invalid, "string literal") \
|
||||
F(Undefined, -1, Invalid, Invalid, Invalid, "constant") \
|
||||
F(Word, -1, Invalid, Invalid, Invalid, "word") \
|
||||
F(ParenOpen, -1, Invalid, Invalid, ParenClose, "'('") \
|
||||
F(ParenClose, 18, Invalid, Invalid, ParenOpen, "')'") \
|
||||
F(BraceOpen, -1, Invalid, Invalid, BraceClose, "'{'") \
|
||||
F(BraceClose, 18, Invalid, Invalid, BraceOpen, "'}'") \
|
||||
F(Comma, 17, Invalid, Comma, Invalid, "','") \
|
||||
F(MemberAccess, 2, Invalid, MemberAccess, Invalid, "member access operator '.'") \
|
||||
F(Dot, -1, Invalid, Invalid, Invalid, "punctuation mark '.'") \
|
||||
F(Colon, -1, Invalid, Invalid, Invalid, "':'") \
|
||||
F(Less, 9, Invalid, CompareLess, Invalid, "less than") \
|
||||
F(Greater, 9, Invalid, CompareGreater, Invalid, "greater than") \
|
||||
F(NotEquals, 10, Invalid, CompareNotEqual, Invalid, "not equals") \
|
||||
F(Equals, 10, Invalid, CompareEqual, Invalid, "equals") \
|
||||
F(Plus, 6, Invalid, Plus, Invalid, "plus") \
|
||||
F(AmbiguousMinus, -2, Invalid, Invalid, Invalid, "minus") \
|
||||
F(UnaryMinus, 3, Minus, Invalid, Invalid, "unary minus") \
|
||||
F(BinaryMinus, 6, Invalid, Minus, Invalid, "binary minus") \
|
||||
F(Multiplication, 5, Invalid, Multiplication, Invalid, "multiplication") \
|
||||
F(Division, 5, Invalid, Division, Invalid, "division") \
|
||||
F(FunctionCall, 2, Invalid, FunctionCall, Invalid, "function call token") \
|
||||
F(ExclamationMark, 3, AssertCompletion, Invalid, Invalid, "exclamation mark") \
|
||||
F(Is, -1, Invalid, Invalid, Invalid, "operator is")
|
||||
|
||||
enum class TokenType {
|
||||
#define ID(name, precedence, unary_name, binary_name, matching_bracket) name,
|
||||
#define ID(name, precedence, unary_name, binary_name, matching_bracket, name_for_diagnostic) name,
|
||||
ENUMERATE_TOKENS(ID)
|
||||
#undef ID
|
||||
};
|
||||
|
@ -62,14 +62,16 @@ constexpr struct TokenInfo {
|
|||
UnaryOperator as_unary_operator;
|
||||
BinaryOperator as_binary_operator;
|
||||
TokenType matching_bracket;
|
||||
StringView name_for_diagnostic;
|
||||
} token_info[] = {
|
||||
#define TOKEN_INFO(name, precedence, unary_name, binary_name, matching_bracket) \
|
||||
{ \
|
||||
#name##sv, \
|
||||
precedence, \
|
||||
UnaryOperator::unary_name, \
|
||||
BinaryOperator::binary_name, \
|
||||
TokenType::matching_bracket, \
|
||||
#define TOKEN_INFO(name, precedence, unary_name, binary_name, matching_bracket, name_for_diagnostic) \
|
||||
{ \
|
||||
#name##sv, \
|
||||
precedence, \
|
||||
UnaryOperator::unary_name, \
|
||||
BinaryOperator::binary_name, \
|
||||
TokenType::matching_bracket, \
|
||||
name_for_diagnostic##sv \
|
||||
},
|
||||
ENUMERATE_TOKENS(TOKEN_INFO)
|
||||
#undef TOKEN_INFO
|
||||
|
@ -78,7 +80,8 @@ constexpr struct TokenInfo {
|
|||
struct Token {
|
||||
TokenInfo const& info() const { return token_info[to_underlying(type)]; }
|
||||
|
||||
StringView name() const { return token_info[to_underlying(type)].name; }
|
||||
StringView name() const { return info().name; }
|
||||
StringView name_for_diagnostic() const { return info().name_for_diagnostic; }
|
||||
i32 precedence() const { return info().precedence; }
|
||||
bool is_operator() const { return precedence() > 0 && precedence() < closing_bracket_precedence; }
|
||||
bool is_ambiguous_operator() const { return precedence() == ambiguous_operator_precedence; }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue