![](/img/trans.png)
[英]Is there a way to post to a route automatically if certain conditions are met in per cgi
[英]Using Parse::Lex, is there a way to return tokens only in certain states/conditions
假设我只需要标记和解析多行注释,我将如何使用Parse :: Lex做到这一点。 使用flex-bison时,lex文件的rules部分中任何模式的默认操作过去都是'skip'。
%%
.* ;
%%
在这里怎么做?
[编辑]好吧,我尝试过,我仍然缺少一些东西-这是我的代码-结果。 我在哪里错了?
我的简化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::Lex
Can't call method "name" on an undefined value at qnlex.pl line 26, <STDIN> line 1.
使用skip
设置(如下所示)使用Regexp :: Common来帮助构造与平衡的注释定界符对匹配的regexp。 我以/* */
作为注释定界符,但它们可以是任何东西。
$lexer->skip(qr! [ \t]+ | $RE{balanced}{-begin=>'/*'}{-end=>'*/'} !xms);
[ \\t]+
替代项保留在原处,因为这是默认选项。
好吧,我想出了这一点:)非常简单-我要做的就是让lex在遇到要跳过的标记时获取下一个标记。 以下是跳过将令牌“ REST”传递到解析器的代码。
sub lex {
my $token;
NEXTTOKEN:
$token = $lexer->next;
return ('', undef) if $lexer->eoi;
if ($token->name eq 'TA') {
return ($token->name, {LINENO => $lexer->line, TEXT => $token->text});
}
elsif ($token->name eq 'REST') {
goto NEXTTOKEN;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.