2010-10-31 115 views
1

我正在嘗試爲Lua創建ANTLR分析器。所以我把Nicolai Mainero製作的語法(可在ANTLR的網站上找到,Lua 5.1語法)並開始工作。ANTLR Lua長字符串語法規則

語法很好。有一件事不起作用:長字符串。

的Lua規範規則:文字

串也可以使用由長括號包圍的 長格式定義。 我們定義一個開放長支架 級別n作爲開放方括號 後跟n個等號,然後是 另一個開放方括號。所以,一個 0級的開放長括號是 寫成[[,一級開放長括號 等級1寫爲[= [等 上。一個結束長支架的定義類似於 ;例如,關閉 等級4的長括號寫爲 ] ====]。長字符串以任何級別的 開頭長支架開始,並且 以同級的第一次結束長支架 結束。括號內的這個 文字可以運行幾行 行,不解釋任何轉義 序列,忽略任何其他級別的長括號 。他們可以包含 任何東西,除了結束括號 適當的水平,適當的水平。

我的問題接近this,但工具是不同的。

LONGSTRING的一些小例子:

LONGSTRING: '[[' (~(']') | ']'(~(']')))* ']]'; 

有人可以幫我:

local a = [==[ Some interesting string [=[ sub string in string ]=] [hello indexes] [[And some line strings]] ]==] - its correct string. 
local f = [==[ Not interesting string ]=] - incorrect string 

這裏我用了 '=' 符號LONGSTRING規則?謝謝!

+1

不要忘記漫長的評論。它們就像長字符串一樣,但是以' - [['開始並以']]結尾。當然他們也允許有0個或更多的'='符號,以便它們可以明確地嵌套。 – RBerteig 2010-11-02 09:21:48

+0

@Rerteig,好點。在我的回答中,我沒有具體提及它們,但是它們在我發佈的語法片段中正確處理。 – 2010-11-02 10:26:09

+0

@Bart,只要你的評論規則處理'「 - 」'後面跟着沒有空白的「LONGSTRING」。 – RBerteig 2010-11-02 19:09:47

回答

1

我曾經寫過一個Lua語法根據規格和解決它像這樣:

grammar Lua; 

// ... options ... 

// ... tokens ... 

@lexer::members { 
    public boolean noCloseAhead(int numEqSigns) { 
     if(input.LA(1) != ']') return true; 
     for(int i = 2; i < numEqSigns+2; i++) { 
      if(input.LA(i) != '=') return true; 
     } 
     return input.LA(numEqSigns+2) != ']'; 
    } 

    public void matchClose(int numEqSigns) throws MismatchedTokenException { 
     StringBuilder eqSigns = new StringBuilder(); 
     for(int i = 0; i < numEqSigns; i++) { 
      eqSigns.append('='); 
     } 
     match("]"+eqSigns+"]"); 
    } 
} 

// ... parser rules ... 

String 
    : '"' (~('"' | '\\') | EscapeSequence)* '"' 
    | '\'' (~('\'' | '\\') | EscapeSequence)* '\'' 
    | LongBracket 
    ; 

Comment 
    : (BlockComment | LineComment) {skip();} 
    ; 

fragment 
BlockComment 
    : '--' LongBracket 
    ; 

fragment 
LineComment 
    : '--' ~('\r' | '\n')* ('\r'? '\n' | EOF) 
    ; 

fragment 
LongBracket 
@init {int openEq = 0;} 
    : '[' ('=' {openEq++;})* '[' ({noCloseAhead(openEq)}?=> .)* {matchClose(openEq);} 
    ; 

// ... more lexer rules ... 

小心你找到關於ANTLR維基什麼!顧名思義:這是一個Wiki,可以發佈相當簡單的東西。你提到的Lua語法是一個不錯的開始,但它有很多錯誤(二進制或十六進制文字也是不正確的,至少在我看它的時候......)。