繁体   English   中英

使用Parse :: Lex,有一种方法只能在某些状态/条件下返回令牌

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM