2012-08-12 37 views
4

假設我需要標記化並僅解析多行註釋,我將如何使用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. 
+0

您的意思是說,例如,如果您正在解析代碼,而您只想處理'/ * * /'中的內容並忽略其餘數據。有點像文檔解析器? – Dervall 2012-08-15 14:57:46

+0

是的..我想保持解析器語法簡單,並將其留給詞法分析器來傳遞選擇性數據。 – trinity 2012-08-15 15:02:20

回答

1

嗯,我想到了這一點:)非常簡單 - 我所要做的就是讓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; 
    } 
} 
1

使用skip設置,這裏顯示使用Regexp::Common來幫助構建匹配平衡的評論分隔符對的正則表達式匹配。我假設/* */作爲評論分隔符,但它們可能是任何東西。

$lexer->skip(qr! [ \t]+ | $RE{balanced}{-begin=>'/*'}{-end=>'*/'} !xms); 

[ \t]+替代留在原處,因爲這是默認的。

+0

嗨@zostay,感謝您的建議! :)我試過了,但仍然缺少一些東西。我編輯了qn以反映我當前的問題 - 請幫助! – trinity 2012-08-21 07:14:22

+0

我不知道那裏有什麼問題。我看不到任何錯誤的東西。 – zostay 2012-08-21 18:53:46

+0

呵呵:(我覺得它與我們傳遞參數到skip方法有關......再次感謝您的建議,我會解決這個問題並在這裏更新以防萬一我發現問題出在哪裏 – trinity 2012-08-22 12:43:09

相關問題