From 0232b204c6c7f00af56ace4683344c3da9c97daf Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 8 Jul 2023 08:52:21 -0400 Subject: [PATCH] Return integer result code from Parser.parse() --- assets/parser.d.erb | 23 ++++++++++++++++--- .../test_d_parser_identical_rules_lookahead.d | 4 ++-- .../test_d_parser_rule_from_multiple_states.d | 6 ++--- spec/test_lexer_match_text.d | 2 +- spec/test_lexer_modes.d | 4 ++-- spec/test_lexer_result_value.d | 4 ++-- spec/test_parser_rule_user_code.d | 2 +- spec/test_parsing_json.d | 14 +++++------ spec/test_parsing_lists.d | 6 ++--- spec/test_pattern.d | 4 ++-- spec/test_return_token_from_pattern.d | 2 +- spec/test_user_code.d | 4 ++-- 12 files changed, 46 insertions(+), 29 deletions(-) diff --git a/assets/parser.d.erb b/assets/parser.d.erb index 8939ed1..907834e 100644 --- a/assets/parser.d.erb +++ b/assets/parser.d.erb @@ -564,7 +564,15 @@ class <%= @classname %> m_lexer = new Lexer(input); } - bool parse() + public enum : size_t + { + P_SUCCESS, + P_DECODE_ERROR, + P_UNEXPECTED_INPUT, + P_UNEXPECTED_TOKEN, + } + + size_t parse() { Lexer.TokenInfo token_info; uint token = _TOKEN_COUNT; @@ -576,6 +584,15 @@ class <%= @classname %> if (token == _TOKEN_COUNT) { size_t lexer_result = m_lexer.lex_token(&token_info); + switch (lexer_result) + { + case Lexer.P_UNEXPECTED_INPUT: + return P_UNEXPECTED_INPUT; + case Lexer.P_DECODE_ERROR: + return P_DECODE_ERROR; + default: + break; + } token = token_info.token; } uint shift_state = 0xFFFFFFFFu; @@ -590,7 +607,7 @@ class <%= @classname %> { /* Successful parse. */ parse_result = statevalues[$-1].pvalue; - return true; + return P_SUCCESS; } } if (shift_state != 0xFFFFFFFFu) @@ -634,7 +651,7 @@ class <%= @classname %> { writeln("{other}"); } - return false; + return P_UNEXPECTED_TOKEN; } } diff --git a/spec/test_d_parser_identical_rules_lookahead.d b/spec/test_d_parser_identical_rules_lookahead.d index 0b34a21..3ca758c 100644 --- a/spec/test_d_parser_identical_rules_lookahead.d +++ b/spec/test_d_parser_identical_rules_lookahead.d @@ -10,9 +10,9 @@ unittest { string input = "aba"; auto parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); input = "abb"; parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); } diff --git a/spec/test_d_parser_rule_from_multiple_states.d b/spec/test_d_parser_rule_from_multiple_states.d index 8fff083..8ef50e2 100644 --- a/spec/test_d_parser_rule_from_multiple_states.d +++ b/spec/test_d_parser_rule_from_multiple_states.d @@ -10,13 +10,13 @@ unittest { string input = "a"; auto parser = new Testparser.Parser(input); - assert(parser.parse() == false); + assert(parser.parse() == Testparser.Parser.P_UNEXPECTED_TOKEN); input = "a b"; parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); input = "bb"; parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); } diff --git a/spec/test_lexer_match_text.d b/spec/test_lexer_match_text.d index 669757c..fc3ffd6 100644 --- a/spec/test_lexer_match_text.d +++ b/spec/test_lexer_match_text.d @@ -10,6 +10,6 @@ unittest { string input = `identifier_123`; auto parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); writeln("pass1"); } diff --git a/spec/test_lexer_modes.d b/spec/test_lexer_modes.d index 00000a1..a36d295 100644 --- a/spec/test_lexer_modes.d +++ b/spec/test_lexer_modes.d @@ -10,11 +10,11 @@ unittest { string input = `abc "a string" def`; auto parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); writeln("pass1"); input = `abc "abc def" def`; parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); writeln("pass2"); } diff --git a/spec/test_lexer_result_value.d b/spec/test_lexer_result_value.d index 7d2fa13..2d7510e 100644 --- a/spec/test_lexer_result_value.d +++ b/spec/test_lexer_result_value.d @@ -10,11 +10,11 @@ unittest { string input = `x`; auto parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); assert(parser.result == 1u); input = `fabulous`; parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); assert(parser.result == 8u); } diff --git a/spec/test_parser_rule_user_code.d b/spec/test_parser_rule_user_code.d index 9b0b503..9f1e436 100644 --- a/spec/test_parser_rule_user_code.d +++ b/spec/test_parser_rule_user_code.d @@ -10,5 +10,5 @@ unittest { string input = "ab"; auto parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); } diff --git a/spec/test_parsing_json.d b/spec/test_parsing_json.d index 3ad4abc..521f2ba 100644 --- a/spec/test_parsing_json.d +++ b/spec/test_parsing_json.d @@ -11,33 +11,33 @@ unittest { string input = ``; auto parser = new Testparser.Parser(input); - assert(parser.parse()); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); input = `{}`; parser = new Testparser.Parser(input); - assert(parser.parse()); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); assert(cast(JSONObject)parser.result); input = `[]`; parser = new Testparser.Parser(input); - assert(parser.parse()); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); assert(cast(JSONArray)parser.result); input = `-45.6`; parser = new Testparser.Parser(input); - assert(parser.parse()); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); assert(cast(JSONNumber)parser.result); assert((cast(JSONNumber)parser.result).value == -45.6); input = `2E-2`; parser = new Testparser.Parser(input); - assert(parser.parse()); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); assert(cast(JSONNumber)parser.result); assert((cast(JSONNumber)parser.result).value == 0.02); input = `{"hi":true}`; parser = new Testparser.Parser(input); - assert(parser.parse()); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); assert(cast(JSONObject)parser.result); JSONObject o = cast(JSONObject)parser.result; assert(o.value["hi"]); @@ -45,7 +45,7 @@ unittest input = `{"ff": false, "nn": null}`; parser = new Testparser.Parser(input); - assert(parser.parse()); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); assert(cast(JSONObject)parser.result); o = cast(JSONObject)parser.result; assert(o.value["ff"]); diff --git a/spec/test_parsing_lists.d b/spec/test_parsing_lists.d index 297891c..7fcda71 100644 --- a/spec/test_parsing_lists.d +++ b/spec/test_parsing_lists.d @@ -10,16 +10,16 @@ unittest { string input = "a"; auto parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); assert(parser.result == 1u); input = ""; parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); assert(parser.result == 0u); input = "aaaaaaaaaaaaaaaa"; parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); assert(parser.result == 16u); } diff --git a/spec/test_pattern.d b/spec/test_pattern.d index d8c160d..fad7d28 100644 --- a/spec/test_pattern.d +++ b/spec/test_pattern.d @@ -10,11 +10,11 @@ unittest { string input = "abcdef"; auto parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); writeln("pass1"); input = "defabcdef"; parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); writeln("pass2"); } diff --git a/spec/test_return_token_from_pattern.d b/spec/test_return_token_from_pattern.d index 66a755f..5572a4a 100644 --- a/spec/test_return_token_from_pattern.d +++ b/spec/test_return_token_from_pattern.d @@ -10,5 +10,5 @@ unittest { string input = "defghidef"; auto parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); } diff --git a/spec/test_user_code.d b/spec/test_user_code.d index 719065a..45f37ad 100644 --- a/spec/test_user_code.d +++ b/spec/test_user_code.d @@ -10,11 +10,11 @@ unittest { string input = "abcdef"; auto parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); writeln("pass1"); input = "abcabcdef"; parser = new Testparser.Parser(input); - assert(parser.parse() == true); + assert(parser.parse() == Testparser.Parser.P_SUCCESS); writeln("pass2"); }