3

yacc ファイルに以下のような文法規則を設定したいと考えています。

insert_statement: INSERT INTO NAME (any_token)* ';'

次のように yacc で、エラーが発生した特定のトークンまですべてのトークンをスキップできます。

stat: error ';'

エラーがない場合、yacc で任意の数の文字をスキップするメカニズムはありますか?

ありがとう

4

3 に答える 3

3

しばらくして、次の方法で問題を解決できたので、誰かに役立つので言及したいと思います。

  • スキップ トークンに含める必要がある文字を含むトークン定義を lex に追加します。

    <*>[A-Za-z0-9_:.-]* { SKIPPINGTOKS を返します。}

    (これは、a、1、hello、hello123 などの任意のトークンを識別します。)

  • 次に、必要に応じて次のルールを yacc に追加します。

    insert_statement: INSERT INTO NAME skipping_portion ';'

    skipping_portion: SKIPPINGTOKS | skipping_portion SKIPPINGTOKS

これが誰かを助けることを願っています...

于 2012-08-31T06:47:20.367 に答える
2

このようなことをしたいと思うでしょう。セミコロン以外のすべてのトークンをスキップします。

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: ; 
于 2012-06-04T23:30:45.243 に答える
0

これらのトークンを含むプロダクション ルールを指定しないでください。スキップします。

于 2012-06-04T15:01:32.590 に答える