2009-12-10 3 views
0

Я пытаюсь проанализировать Lua, который в некоторых случаях зависит от пробелов из-за того, что он не использует фигурные скобки для области видимости. Я полагаю, что, выбрасывая пробелы, только если другое правило не соответствует, это лучший способ, но я не знаю, как это сделать. Кто-нибудь может мне помочь?Удалить пробелы, но так ли?

+0

У меня нет опыта работы с Lua, так что вы могли бы привести пример, когда пустое пространство нельзя игнорировать (или положить на '$ channel = HIDDEN')? Например, –

+0

имеет значение if, которое выглядит следующим образом: 'if' * 'condition' *' then '*' block' * 'end', а пробелы важны для корректного чтения идентифицирующих слов. – RCIX

ответ

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 

Нет необходимости принимать во внимание пробелы, AFAIK. Таким образом, вы можете просто добавить:

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

в вашей грамматике.

EDIT

Кажется, есть грамматика Lua на ANTLR вики: http://www.antlr.org/grammar/1178608849736/Lua.g

И я, кажется, мое предложение, если заявление несколько отличается от приведенной выше грамматики:

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

, который является правильным, как вы можете видеть.

+0

Проблема в том, что я пытаюсь сопоставить поведение компилятора lua, который не будет компилировать 'ifj == 10thenprint ('j равно 10') end', поскольку ни ifj, ни thenprint не являются допустимыми ключевыми словами. – RCIX

+1

Разбор 'ifj == 10thenprint ('j равно 10') end' не принимается как действительная инструкция if. Вам не нужно указывать пробелы между ними. Скрывать пробелы будет достаточно. –

+0

Хорошо круто. Спасибо за помощь! – RCIX