假設我需要標記化並僅解析多行註釋,我將如何使用Parse :: Lex來做到這一點。使用flex-bison時,lex文件規則部分中任何模式的默認操作都是「跳過」。使用Parse :: 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.
您的意思是說,例如,如果您正在解析代碼,而您只想處理'/ * * /'中的內容並忽略其餘數據。有點像文檔解析器? – Dervall 2012-08-15 14:57:46
是的..我想保持解析器語法簡單,並將其留給詞法分析器來傳遞選擇性數據。 – trinity 2012-08-15 15:02:20