Get test_lexer_unknown_character working for C
This commit is contained in:
parent
36213d9e9c
commit
aef5367378
@ -206,14 +206,19 @@ class Propane
|
|||||||
index = $1.to_i
|
index = $1.to_i
|
||||||
case @language
|
case @language
|
||||||
when "c"
|
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"
|
when "d"
|
||||||
"statevalues[$-1-n_states+#{index}].pvalue.v_#{rule.components[index - 1].ptypename}"
|
"statevalues[$-1-n_states+#{index}].pvalue.v_#{rule.components[index - 1].ptypename}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
code = code.gsub(/\$\$/) do |match|
|
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
|
end
|
||||||
code = code.gsub(/\$mode\(([a-zA-Z_][a-zA-Z_0-9]*)\)/) do |match|
|
code = code.gsub(/\$mode\(([a-zA-Z_][a-zA-Z_0-9]*)\)/) do |match|
|
||||||
mode_name = $1
|
mode_name = $1
|
||||||
|
@ -98,7 +98,25 @@ EOF
|
|||||||
end
|
end
|
||||||
|
|
||||||
it "detects a lexer error when an unknown character is seen" do
|
it "detects a lexer error when an unknown character is seen" do
|
||||||
write_grammar <<EOF
|
case language
|
||||||
|
when "c"
|
||||||
|
write_grammar <<EOF
|
||||||
|
ptype int;
|
||||||
|
token int /\\d+/ <<
|
||||||
|
int v = 0;
|
||||||
|
for (size_t i = 0u; i < match_length; i++)
|
||||||
|
{
|
||||||
|
v *= 10;
|
||||||
|
v += (match[i] - '0');
|
||||||
|
}
|
||||||
|
$$ = v;
|
||||||
|
>>
|
||||||
|
Start -> int <<
|
||||||
|
$$ = $1;
|
||||||
|
>>
|
||||||
|
EOF
|
||||||
|
when "d"
|
||||||
|
write_grammar <<EOF
|
||||||
ptype int;
|
ptype int;
|
||||||
token int /\\d+/ <<
|
token int /\\d+/ <<
|
||||||
int v;
|
int v;
|
||||||
@ -113,6 +131,7 @@ Start -> int <<
|
|||||||
$$ = $1;
|
$$ = $1;
|
||||||
>>
|
>>
|
||||||
EOF
|
EOF
|
||||||
|
end
|
||||||
build_parser(language: language)
|
build_parser(language: language)
|
||||||
compile("spec/test_lexer_unknown_character.#{language}", language: language)
|
compile("spec/test_lexer_unknown_character.#{language}", language: language)
|
||||||
results = run
|
results = run
|
||||||
|
18
spec/test_lexer_unknown_character.c
Normal file
18
spec/test_lexer_unknown_character.c
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#include "testparser.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user