LibJS: Remove syntax errors from lexer
Giving the lexer the ability to generate errors adds unnecessary complexity - also it only calls its syntax_error() function in one place anyway ("unterminated string literal"). But since the lexer *also* emits tokens like Eof or UnterminatedStringLiteral, it should be up to the consumer of these tokens to decide what to do. Also remove the option to not print errors to stderr as that's not relevant anymore.
This commit is contained in:
parent
3485613f4a
commit
00b61a212f
Notes:
sideshowbarker
2024-07-19 06:38:51 +09:00
Author: https://github.com/linusg Commit: https://github.com/SerenityOS/serenity/commit/00b61a212fb Pull-request: https://github.com/SerenityOS/serenity/pull/2221 Reviewed-by: https://github.com/Dexesttp
4 changed files with 2 additions and 20 deletions
|
@ -240,13 +240,6 @@ bool Lexer::is_numeric_literal_start() const
|
||||||
return isdigit(m_current_char) || (m_current_char == '.' && m_position < m_source.length() && isdigit(m_source[m_position]));
|
return isdigit(m_current_char) || (m_current_char == '.' && m_position < m_source.length() && isdigit(m_source[m_position]));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Lexer::syntax_error(const char* msg)
|
|
||||||
{
|
|
||||||
m_has_errors = true;
|
|
||||||
if (m_log_errors)
|
|
||||||
fprintf(stderr, "Syntax Error: %s (line: %zu, column: %zu)\n", msg, m_line_number, m_line_column);
|
|
||||||
}
|
|
||||||
|
|
||||||
Token Lexer::next()
|
Token Lexer::next()
|
||||||
{
|
{
|
||||||
size_t trivia_start = m_position;
|
size_t trivia_start = m_position;
|
||||||
|
@ -395,7 +388,6 @@ Token Lexer::next()
|
||||||
consume();
|
consume();
|
||||||
}
|
}
|
||||||
if (m_current_char != stop_char) {
|
if (m_current_char != stop_char) {
|
||||||
syntax_error("unterminated string literal");
|
|
||||||
token_type = TokenType::UnterminatedStringLiteral;
|
token_type = TokenType::UnterminatedStringLiteral;
|
||||||
} else {
|
} else {
|
||||||
consume();
|
consume();
|
||||||
|
|
|
@ -37,14 +37,8 @@ namespace JS {
|
||||||
class Lexer {
|
class Lexer {
|
||||||
public:
|
public:
|
||||||
explicit Lexer(StringView source);
|
explicit Lexer(StringView source);
|
||||||
Lexer(StringView source, bool log_errors)
|
|
||||||
: Lexer(source)
|
|
||||||
{
|
|
||||||
m_log_errors = log_errors;
|
|
||||||
}
|
|
||||||
|
|
||||||
Token next();
|
Token next();
|
||||||
bool has_errors() const { return m_has_errors; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void consume();
|
void consume();
|
||||||
|
@ -60,16 +54,12 @@ private:
|
||||||
bool match(char, char, char) const;
|
bool match(char, char, char) const;
|
||||||
bool match(char, char, char, char) const;
|
bool match(char, char, char, char) const;
|
||||||
|
|
||||||
void syntax_error(const char*);
|
|
||||||
|
|
||||||
StringView m_source;
|
StringView m_source;
|
||||||
size_t m_position = 0;
|
size_t m_position = 0;
|
||||||
Token m_current_token;
|
Token m_current_token;
|
||||||
int m_current_char = 0;
|
int m_current_char = 0;
|
||||||
bool m_has_errors = false;
|
|
||||||
size_t m_line_number = 1;
|
size_t m_line_number = 1;
|
||||||
size_t m_line_column = 1;
|
size_t m_line_column = 1;
|
||||||
bool m_log_errors = true;
|
|
||||||
|
|
||||||
struct TemplateState {
|
struct TemplateState {
|
||||||
bool in_expr;
|
bool in_expr;
|
||||||
|
|
|
@ -75,7 +75,7 @@ public:
|
||||||
NonnullRefPtr<NewExpression> parse_new_expression();
|
NonnullRefPtr<NewExpression> parse_new_expression();
|
||||||
RefPtr<FunctionExpression> try_parse_arrow_function_expression(bool expect_parens);
|
RefPtr<FunctionExpression> try_parse_arrow_function_expression(bool expect_parens);
|
||||||
|
|
||||||
bool has_errors() const { return m_parser_state.m_lexer.has_errors() || m_parser_state.m_has_errors; }
|
bool has_errors() const { m_parser_state.m_has_errors; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class ScopePusher;
|
friend class ScopePusher;
|
||||||
|
|
|
@ -524,7 +524,7 @@ int main(int argc, char** argv)
|
||||||
|
|
||||||
size_t open_indents = s_repl_line_level;
|
size_t open_indents = s_repl_line_level;
|
||||||
|
|
||||||
JS::Lexer lexer(str, false);
|
JS::Lexer lexer(str);
|
||||||
bool indenters_starting_line = true;
|
bool indenters_starting_line = true;
|
||||||
for (JS::Token token = lexer.next(); token.type() != JS::TokenType::Eof; token = lexer.next()) {
|
for (JS::Token token = lexer.next(); token.type() != JS::TokenType::Eof; token = lexer.next()) {
|
||||||
auto length = token.value().length();
|
auto length = token.value().length();
|
||||||
|
|
Loading…
Add table
Reference in a new issue