Add p_value_get() / p_value_get_XXX() accessors
Allow user code to access specific pvalue values, especially when multiple ptypes are in use.
This commit is contained in:
1 parent
b641c64425
commit
5ac3ad1655
6 files changed
+132
-5
No files matched your search
@@ -1781,6 +1781,39 @@ EOF
|
||||
results = run_test(language: language)
|
||||
expect(results.status).to eq 0
|
||||
end
|
||||
|
||||
it "provides accessor functions to extract user values from a parser value" do
|
||||
if language == "d"
|
||||
write_grammar <<EOF
|
||||
ptype int;
|
||||
ptype float = float;
|
||||
ptype string = string;
|
||||
|
||||
drop /\\s+/;
|
||||
token num /\\d+/ << $$ = 42; >>
|
||||
token flt (float) /f/ << $$ = 1.5; >>
|
||||
token str (string) /s/ << $$ = "hello"; >>
|
||||
Start -> num flt str;
|
||||
EOF
|
||||
else
|
||||
write_grammar <<EOF
|
||||
ptype int;
|
||||
ptype float = float;
|
||||
ptype string = char *;
|
||||
|
||||
drop /\\s+/;
|
||||
token num /\\d+/ << $$ = 42; >>
|
||||
token flt (float) /f/ << $$ = 1.5; >>
|
||||
token str (string) /s/ << $$ = (char *)"hello"; >>
|
||||
Start -> num flt str;
|
||||
EOF
|
||||
end
|
||||
run_propane(language: language)
|
||||
compile("spec/test_value_accessors.#{language}", language: language)
|
||||
results = run_test(language: language)
|
||||
expect(results.stderr).to eq ""
|
||||
expect(results.status).to eq 0
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,29 @@
|
||||
#include "testparser.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
p_token_info_t token_info;
|
||||
char const * input = "42 f s";
|
||||
p_context_t * context;
|
||||
context = p_context_new((uint8_t const *)input, strlen(input));
|
||||
|
||||
/* Default ptype value extracted with p_value_get(). */
|
||||
assert(p_lex(context, &token_info) == P_SUCCESS);
|
||||
assert(token_info.token == TOKEN_num);
|
||||
assert(p_value_get(&token_info.pvalue) == 42);
|
||||
|
||||
/* Named ptype values extracted with p_value_get_XXX(). */
|
||||
assert(p_lex(context, &token_info) == P_SUCCESS);
|
||||
assert(token_info.token == TOKEN_flt);
|
||||
assert(p_value_get_float(&token_info.pvalue) == 1.5);
|
||||
|
||||
assert(p_lex(context, &token_info) == P_SUCCESS);
|
||||
assert(token_info.token == TOKEN_str);
|
||||
assert(strcmp(p_value_get_string(&token_info.pvalue), "hello") == 0);
|
||||
|
||||
p_context_delete(context);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
import testparser;
|
||||
import std.stdio;
|
||||
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
p_token_info_t token_info;
|
||||
string input = "42 f s";
|
||||
p_context_t * context;
|
||||
context = p_context_new(input);
|
||||
|
||||
/* Default ptype value extracted with p_value_get(). */
|
||||
assert(p_lex(context, &token_info) == P_SUCCESS);
|
||||
assert(token_info.token == TOKEN_num);
|
||||
assert(p_value_get(&token_info.pvalue) == 42);
|
||||
|
||||
/* Named ptype values extracted with p_value_get_XXX(). */
|
||||
assert(p_lex(context, &token_info) == P_SUCCESS);
|
||||
assert(token_info.token == TOKEN_flt);
|
||||
assert(p_value_get_float(&token_info.pvalue) == 1.5);
|
||||
|
||||
assert(p_lex(context, &token_info) == P_SUCCESS);
|
||||
assert(token_info.token == TOKEN_str);
|
||||
assert(p_value_get_string(&token_info.pvalue) == "hello");
|
||||
}
|
||||
Reference in new issue
Block a user