我想在我的 yacc 文件中有如下语法规则:
insert_statement: INSERT INTO NAME (any_token)* ';'
我们可以跳过所有的标记,直到出现错误的给定标记,在 yacc 中如下所示:
stat: error ';'
当没有错误时,是否有任何机制可以跳过 yacc 中的任意数量的字符?
谢谢
一段时间后,我可以通过以下方式解决我的问题,并想提及它,因为它会对某人有所帮助:
向 lex 添加一个标记定义,包括应该在跳过标记中的字符:
<*>[A-Za-z0-9_:.-]* { return SKIPPINGTOKS; }
(这将识别任何标记,如 a、1、hello、hello123 等)
然后根据需要将以下此类规则添加到 yacc 中:
insert_statement: INSERT INTO NAME skipping_portion ';'
跳过部分:跳过 | 跳过部分跳过
希望这可以帮助某人...
我想你会想做这样的事情。它会跳过所有不是分号的标记。
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: ;
只需不要指定包含这些标记的生产规则,您想跳过。