我希望在我的yacc文件中有如下语法规则:
insert_statement: INSERT INTO NAME (any_token)* ';'
我们可以跳过所有令牌,直到出现错误的给定令牌,在yacc中如下:
stat: error ';'
当没有错误时,是否有任何机制可以跳过yacc中的任意数量的字符?
由于
答案 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)
只是不指定包含这些令牌的生产规则,您想跳过。