在yacc中跳过令牌

时间:2012-06-03 15:18:30

标签: token yacc skip

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

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

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

stat: error ';'

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

由于

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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: ; 

答案 2 :(得分:0)

只是不指定包含这些令牌的生产规则,您想跳过。