2009-12-10 174 views
0

我試圖解析Lua,它在某些情況下依賴於空白,因爲它沒有爲範圍使用大括號。我認爲只有在另一個規則不匹配時才拋出空白是最好的方法,但我不知道如何做到這一點。有人能幫我嗎?刪除空格,但最後刪除空格嗎?

+0

我沒有Lua的經驗,所以你可能舉一個例子,當一個空格不能被忽略(或放在'$ channel = HIDDEN')? – 2009-12-10 09:06:34

+0

舉例來說,你的if語句就是這樣的:'if'*'condition' *'then'*'block' *'end'並且空格是重要的,這樣可以正確讀取識別字。 – RCIX 2009-12-10 10:23:00

回答

1

看着Lua's documentation,我看到沒有必要考慮空格。

解析器規則ifStatement

ifStatement 
    : 'if' exp 'then' block ('elseif' exp 'then' block 'else' block)? 'end' 
    ; 

exp 
    : /* todo */ 
    ; 

block 
    : /* todo */ 
    ; 

應符合兩個:

if j==10 then print ("j equals 10") end 

和:

if j<10 then 
    print ("j < 10") 
elseif j>100 then 
    print ("j > 100") 
else 
    print ("j >= 10 && j <= 100") 
end 

沒有必要採取空間考慮進去,據我所知。所以你可以在你的文法中加上:

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

編輯

似乎有在ANTLR維基Lua的語法:http://www.antlr.org/grammar/1178608849736/Lua.g

而且似乎我我的一個建議,如果聲明中略微從上面的語法不同:

'if' exp 'then' block ('elseif' exp 'then' block)* ('else' block)? 'end' 

這是正確的,你可以看到。

+0

Bu問題是,我試圖匹配lua的編譯器的行爲,它不會編譯ifj == 10thenprint('j等於10')end,因爲ifj或thenprint都不是有效的關鍵字。 – RCIX 2009-12-10 21:16:43

+1

解析'ifj == 10thenprint('j等於10')end'不會被接受爲有效的if語句。您不需要在它們之間指定空格。隱藏空間就足夠了。 – 2009-12-11 07:28:32

+0

好酷。謝謝您的幫助! – RCIX 2009-12-11 23:31:33