3

我想在我的 yacc 文件中有如下语法规则:

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

我们可以跳过所有的标记,直到出现错误的给定标记,在 yacc 中如下所示:

stat: error ';'

当没有错误时,是否有任何机制可以跳过 yacc 中的任意数量的字符?

谢谢

4

3 回答 3

3

一段时间后,我可以通过以下方式解决我的问题,并想提及它,因为它会对某人有所帮助:

  • 向 lex 添加一个标记定义,包括应该在跳过标记中的字符:

    <*>[A-Za-z0-9_:.-]* { return SKIPPINGTOKS; }

    (这将识别任何标记,如 a、1、hello、hello123 等)

  • 然后根据需要将以下此类规则添加到 yacc 中:

    insert_statement: INSERT INTO NAME skipping_portion ';'

    跳过部分:跳过 | 跳过部分跳过

希望这可以帮助某人...

于 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 回答