2013-02-11 48 views
1

我有以下形式的腳本語言: <keyword> = <text>,ANTLR v3的解析領域特定語言

哪裏<text>可以包含關鍵字有時<text>可以包含指令取決於什麼<keyword>使用。

我想根據<keyword>的使用情況來處理<text>

/* lang.g */ 
grammar lang; 

/* parser rules */ 
script  : assignment+ ; 

assignment : keyword VALUE ; 

/* cannot do the following (but I would like to) 

assignment : command | command_b | display ; 
command : COMMAND '=' /* parser rules for command */ ',' ; 
command_b : COMMAND_B '=' /* parser rules for command_b */ ',' ; 
display : DISPLAY '=' ~(',')+ ',' ; 
*/ 

/* lexer rules */ 
VALUE  : '='! ~(',')+ ','! 

COMMAND : 'command' ; 
COMMAND_B : 'command_b' ; 
DISPLAY : 'display' ; 

WS   : (' '|'\t'|'\r'|'\n')+ {$channel=HIDDEN;} ; 

例輸入文件:

command = goto->step_b, 
display = this is some plain text. command keyword used, 
command_b = read_file:"readme.txt", 

我希望能夠以不同的方式處理commandcommand_bdisplay規則使用ANTLR不使用目標語言協助解析一切。使用上面的* .g文件;第一行有commandgoto->step_b作爲標記。需要進一步解析goto->step_b,那麼讓ANTLR完成所有這些工作而不是目標語言會很好。

如果沒有辦法直接做到這一點,我想我會在兩個階段完成這一點。上述

  1. 使用* .G文件來分析輸入文件
  2. 卡爾的一切,但commandcommand_b節點;僅使用爲commandcommand_b語法定義的語法將這些節點饋送到另一解析器。

有沒有辦法使用單一的語法,這樣我可以處理command/command_b規則不同於任何其他規則解析腳本?或者我將不得不在多個階段處理腳本文件?

感謝您的任何幫助。

喬希

回答

1

看一看我的答案在這裏:

antlr identifier name same as pre-defined function name cause MismatchedTokenException

可以使用非模糊語義斷言,以保持這些規則出你的語法:

COMMAND : 'command' ; 
COMMAND_B : 'command_b' ; 
DISPLAY : 'display' ; 

,而是你會寫規則,如:

functions_stats 
    : {input.LT(1).getText().equals("command")}? '=' /* parser rules for command */ ',' ; 
    ; 

語義謂詞中的動作是語言特定的,因此可能因您的目標語言而異。它適用於Java,也可能適用於其他許多應用程序。