2015-02-09 94 views
0

我使用的lex/yacc的編寫彙編萊克斯優先級標記操作碼優先

我有例如某些操作碼

ORA        [Oo][Rr][Aa] 
AND        [Aa][Nn][Dd] 
EOR        [Ee][Oo][Rr] 

和規則

{ORA}       { yylval.iValue = ora; return OPCODE; } 
{AND}       { yylval.iValue = and; return OPCODE; } 
{EOR}       { yylval.iValue = eor; return OPCODE; } 

我也有一個標籤規則

[A-Za-z_][A-Za-z0-9_]*:   { yylval.sIndex = AddSymbol(yytext); return SYMBOL; } 
    [A-Za-z_][A-Za-z0-9_]*   { yylval.sIndex = AddSymbol(yytext); return SYMBOL; } 

labels in the syntax can be 

    ldx #$FF 
loop: 
    sta $5535,X 
    dex 
    bne loop 

問題是它會匹配標籤而不是操作碼。 第一個標籤規則由於':'而起作用,但第二個標籤規則需要主持操作碼規則。

有沒有辦法讓我第二個案例的標籤工作(雙向循環)?

在此先感謝。

我對lex相當陌生。

回答

1

確保操作碼規則出現在catch-all標識符規則之前。如果兩個規則都適用於最長匹配的標記,(f)lex生成的掃描程序選擇源中的第一個。

定義不會改變規則的優先級。重要的是規則本身的順序。


順便說一句,你可能要考慮讓:令牌本身,而不是合併的loop(一個使用一個定義,另一個)到同樣類型的兩個實例。

像這樣在令牌中包含冒號可防止用戶在標籤名稱和之間放置空格,但這可能是您的意圖。而在某些語法中,雙令牌標籤定義會導致語法爲LR(2)而不是LR(1)

在任何情況下,如果通過給定一個不同的標記類型將定義標記爲定義,幾乎可以肯定地發現它更簡單。