2012-02-13 58 views
2

我正在寫一個使用指令列表代碼的解釋器。當我嘗試使用標籤編寫指令的語法時,我遇到了一些問題。ANTLR語法 - 解析標籤和指令

我想這個解析器代碼塊:

LD 4 
ST A 
LD A 
EQ 4 
ST _AUX_1 
(* IF *) 
LDN _AUX_1 
JMPC _label_2 
(* THEN *) 
LD B 
EQ 3 
ST _AUX_2 
_label_2: (* ELSE *) 
_label_1: (* END IF*) 
LD TRUE 

正如你可以看到這些標籤是在沒有指令的單行線,但語言I'have到解析器允許「標籤+指令」中一條線。因此,有三種型動物種指令和標籤的組合:

  • 標籤

    1. 指令:
    2. 標籤:指令

    我可以分析1和2,但我不能夠解析所有不同的組合。

    這是我的ANTLR語法的摘錄:

    program_il : instruction* ; 
    
    instruction 
         : ID':' // label 
         | ID_INST operand 
         ; 
    
    operando 
        : ID 
        | CTE_INT 
        | CTE_BOOL 
        ; 
    

    我試圖語法更改爲:

    instruction : (ID':')? instruction? ; 
    

    但我有一個錯誤:

    As a result, alternative(s) 2 were disabled for that input 
    [14:43:49] error(201): Analizador.g:131:29: The following alternatives can never be matched: 2 
    

    有人可以幫我解決這個問題嗎? 預先感謝您。

  • 回答

    1

    因爲你現在接受Label: Instruction,語法是不明確的。解析器不能加以區分:

    lbl: 
    LD 4 
    

    lbl: LD 4 
    

    換句話說,你需要讓你的instruction S按某種分隔符分隔。如下面的演示展示了一個換行符會做的伎倆:

    grammar T; 
    
    program_il 
    : NL* instruction (NL+ instruction)* NL* EOF 
    ; 
    
    instruction 
    : ID ':' (ID_INST operand)? 
    | ID_INST operand 
    ; 
    
    operand 
    : ID 
    | CTE_INT 
    | CTE_BOOL 
    ; 
    
    CTE_BOOL 
    : 'TRUE' 
    | 'FALSE' 
    ; 
    
    ID_INST 
    : 'LD' 
    | 'ST' 
    | 'EQ' 
    | 'LDN' 
    | 'JMPC' 
    ; 
    
    ID 
    : ('_' | 'a'..'z' | 'A'..'Z') ('_' | 'a'..'z' | 'A'..'Z' | '0'..'9')* 
    ; 
    
    CTE_INT 
    : ('0'..'9')+ 
    ; 
    
    NL 
    : '\r'? '\n' 
    | '\r' 
    ; 
    
    COMMENT 
    : '(*' .* '*)' {skip();} 
    ; 
    
    SPACE 
    : (' ' | '\t')+ {skip();} 
    ; 
    

    現在解析輸入:

    (* IF *) 
    JMPC _label_2 
    (* THEN *) 
    LD B 
    ST _AUX_2 
    _label_2: LDN _AUX_1 (* ELSE *) 
    _label_1: (* END IF*) 
    LD TRUE 
    

    將導致以下三種:

    enter image description here

    +0

    +1,但,儘管我對ANTLR不熟悉,但我認爲執行「指令:(ID':')?ID_INST操作數;」會更清晰。 – 2012-02-13 19:45:38

    +0

    @ 500-InternalServerError,唉,這不適用於ANTLR :)。對於LL解析器來說,在最左側不*有*可選規則是一個好主意。 – 2012-02-13 19:50:31

    +0

    哎唷! - 人們想知道爲什麼不。好吧。 – 2012-02-13 19:51:40