diff options
author | ydah <t.yudai92@gmail.com> | 2024-04-27 21:16:38 +0900 |
---|---|---|
committer | Yuichiro Kaneko <spiketeika@gmail.com> | 2024-04-29 08:38:23 +0900 |
commit | f9cf923af2c54345b1d6756e3268b509655754a3 (patch) | |
tree | 6823bd71243a6031536f14920b93361df2e63752 | |
parent | 29aaf4abe61e5ce24577eb3e8ccaa0a21934bb30 (diff) |
Use user defined parameterizing rules
-rw-r--r-- | ext/ripper/tools/preproc.rb | 11 | ||||
-rw-r--r-- | parse.y | 34 |
2 files changed, 22 insertions, 23 deletions
diff --git a/ext/ripper/tools/preproc.rb b/ext/ripper/tools/preproc.rb index a54302fb91..25cd46e1be 100644 --- a/ext/ripper/tools/preproc.rb +++ b/ext/ripper/tools/preproc.rb @@ -51,6 +51,10 @@ def process(f, out, path, template) usercode f, out, path, template end +require_relative 'dsl' + +RIPPER_CODE_PATTERN = %r</\*% *ripper(?:\[(.*?)\])?: *(.*?) *%\*/> + def prelude(f, out) @exprs = {} while line = f.gets @@ -58,6 +62,9 @@ def prelude(f, out) when /\A%%/ out << "%%\n" return + when RIPPER_CODE_PATTERN # %rule actions may contain /*% ripper: ... %*/ DSL + out << DSL.new($2, ($1 || "").split(",")).generate << "\n" + next else if (/^enum lex_state_(?:bits|e) \{/ =~ line)..(/^\}/ =~ line) case line @@ -74,12 +81,10 @@ def prelude(f, out) end end -require_relative "dsl" - def grammar(f, out) while line = f.gets case line - when %r</\*% *ripper(?:\[(.*?)\])?: *(.*?) *%\*/> + when RIPPER_CODE_PATTERN out << DSL.new($2, ($1 || "").split(",")).generate << "\n" when %r</\*%%%\*/> out << "#if 0\n" @@ -2951,6 +2951,16 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary) %token tLAST_TOKEN +/* + * parameterizing rules + */ +%rule words(begin, word_list): begin ' '+ word_list tSTRING_END + { + $$ = make_list($3, &@$); + /*% ripper: array!($:3) %*/ + } + ; + %% program : { SET_LEX_STATE(EXPR_BEG); @@ -6104,11 +6114,7 @@ regexp : tREGEXP_BEG regexp_contents tREGEXP_END } ; -words : tWORDS_BEG ' '+ word_list tSTRING_END - { - $$ = make_list($3, &@$); - /*% ripper: array!($:3) %*/ - } +words : words(tWORDS_BEG, word_list) <node> ; word_list : /* none */ @@ -6132,11 +6138,7 @@ word : string_content } ; -symbols : tSYMBOLS_BEG ' '+ symbol_list tSTRING_END - { - $$ = make_list($3, &@$); - /*% ripper: array!($:3) %*/ - } +symbols : words(tSYMBOLS_BEG, symbol_list) <node> ; symbol_list : /* none */ @@ -6151,18 +6153,10 @@ symbol_list : /* none */ } ; -qwords : tQWORDS_BEG ' '+ qword_list tSTRING_END - { - $$ = make_list($3, &@$); - /*% ripper: array!($:3) %*/ - } +qwords : words(tQWORDS_BEG, qword_list) <node> ; -qsymbols : tQSYMBOLS_BEG ' '+ qsym_list tSTRING_END - { - $$ = make_list($3, &@$); - /*% ripper: array!($:3) %*/ - } +qsymbols : words(tQSYMBOLS_BEG, qsym_list) <node> ; qword_list : /* none */ |