假设我只需要标记和解析多行注释,我将如何使用 Parse::Lex 做到这一点。使用 flex-bison 时,lex 文件规则部分中任何模式的默认操作都是“跳过”。%%.* ;%%如何在这里做到这一点?[编辑] 好吧,我试过了,我仍然缺少一些东西 - 这是我的代码 - 和结果。我哪里错了??我的简化 lex 文件:use Parse::Lex;use Regexp::Common;use YParser;my $lexer;my @token = (qw|esp:TA abcdefgh|,qw(esp:REST .|\n),);Parse::Lex->trace;Parse::Lex->exclusive('esp');$lexer = Parse::Lex->new(@token);$lexer->from(\*STDIN);$lexer->skip(qr! [ \t]+ | $RE{balanced}{-begin=>'/*'}{-end=>'*/'} !xms);$lexer->start('esp');my $j = YParser->new();$j->YYParse(yylex => \&lex);sub lex { my $token = $lexer->next; return ('', undef) if $lexer->eoi; if ($token->name eq 'TA' || $token->name eq 'REST') { return ($token->name, {LINENO => $lexer->line, TEXT => $token->text}); }}我的简化语法文件% token TA REST%%Program: Element | Program Element;Element: TA | REST;%%输入文件:abcdefgh/*sdf*/结果:perl lexfile.pl Trace is ON in class Parse::LexCan't call method "name" on an undefined value at qnlex.pl line 26, <STDIN> line 1. (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 使用 skip 设置,此处显示使用 Regexp::Common 来帮助构建匹配注释分隔符平衡对的正则表达式。我假设 /* */ 作为注释分隔符,但它们可以是任何东西。$lexer->skip(qr! [ \t]+ | $RE{balanced}{-begin=>'/*'}{-end=>'*/'} !xms);[ \t]+ 替代项保留在原位,因为这是默认设置。 (adsbygoogle = window.adsbygoogle || []).push({}); 10-07 15:05