yacc ファイルに以下のような文法規則を設定したいと考えています。
insert_statement: INSERT INTO NAME (any_token)* ';'
次のように yacc で、エラーが発生した特定のトークンまですべてのトークンをスキップできます。
stat: error ';'
エラーがない場合、yacc で任意の数の文字をスキップするメカニズムはありますか?
ありがとう
しばらくして、次の方法で問題を解決できたので、誰かに役立つので言及したいと思います。
スキップ トークンに含める必要がある文字を含むトークン定義を lex に追加します。
<*>[A-Za-z0-9_:.-]* { SKIPPINGTOKS を返します。}
(これは、a、1、hello、hello123 などの任意のトークンを識別します。)
次に、必要に応じて次のルールを yacc に追加します。
insert_statement: INSERT INTO NAME skipping_portion ';'
skipping_portion: SKIPPINGTOKS | skipping_portion SKIPPINGTOKS
これが誰かを助けることを願っています...
このようなことをしたいと思うでしょう。セミコロン以外のすべてのトークンをスキップします。
insert_statement: INSERT INTO NAME discardable_tokens_or_epsilon ';' ;
discardable_tokens_or_epsilon: discardable_tokens
| epsilon
;
discardable_tokens: discardable_tokens discardable_token
| discardable_token
;
discardable_token: FOO
| BAR
| BLETCH
...et cetera... anything other than a semicolon
;
epsilon: ;
これらのトークンを含むプロダクション ルールを指定しないでください。スキップします。