複数行のコメントのみをトークン化して解析する必要があると仮定すると、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 <inputfile
Trace is ON in class Parse::Lex
Can't call method "name" on an undefined value at qnlex.pl line 26, <STDIN> line 1.