删除空格,但最后删除空格吗?

问题描述:

我试图解析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

看着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