diff --git a/lib/propane/generator.rb b/lib/propane/generator.rb index 87c8f02..f6e8d26 100644 --- a/lib/propane/generator.rb +++ b/lib/propane/generator.rb @@ -206,14 +206,19 @@ class Propane index = $1.to_i case @language when "c" - "state_value_stack_index(statevalues, -1 - (int)n_states + #{index})->pvalue.v_#{rule.components[index - 1].ptypename}" + "state_values_stack_index(statevalues, -1 - (int)n_states + #{index})->pvalue.v_#{rule.components[index - 1].ptypename}" when "d" "statevalues[$-1-n_states+#{index}].pvalue.v_#{rule.components[index - 1].ptypename}" end end else code = code.gsub(/\$\$/) do |match| - "out_token_info.pvalue.v_#{pattern.ptypename}" + case @language + when "c" + "out_token_info->pvalue.v_#{pattern.ptypename}" + when "d" + "out_token_info.pvalue.v_#{pattern.ptypename}" + end end code = code.gsub(/\$mode\(([a-zA-Z_][a-zA-Z_0-9]*)\)/) do |match| mode_name = $1 diff --git a/spec/propane_spec.rb b/spec/propane_spec.rb index 88f345d..16fff6c 100644 --- a/spec/propane_spec.rb +++ b/spec/propane_spec.rb @@ -98,7 +98,25 @@ EOF end it "detects a lexer error when an unknown character is seen" do - write_grammar <> +Start -> int << + $$ = $1; +>> +EOF + when "d" + write_grammar < int << $$ = $1; >> EOF + end build_parser(language: language) compile("spec/test_lexer_unknown_character.#{language}", language: language) results = run diff --git a/spec/test_lexer_unknown_character.c b/spec/test_lexer_unknown_character.c new file mode 100644 index 0000000..5b4e4d4 --- /dev/null +++ b/spec/test_lexer_unknown_character.c @@ -0,0 +1,18 @@ +#include "testparser.h" +#include +#include + +int main() +{ + char const * input = "x"; + p_context_t context; + p_context_init(&context, (uint8_t const *)input, strlen(input)); + assert(p_parse(&context) == P_UNEXPECTED_INPUT); + + input = "123"; + p_context_init(&context, (uint8_t const *)input, strlen(input)); + assert(p_parse(&context) == P_SUCCESS); + assert(p_result(&context) == 123u); + + return 0; +}