Я пытаюсь проанализировать Lua, который в некоторых случаях зависит от пробелов из-за того, что он не использует фигурные скобки для области видимости. Я полагаю, что, выбрасывая пробелы, только если другое правило не соответствует, это лучший способ, но я не знаю, как это сделать. Кто-нибудь может мне помочь?Удалить пробелы, но так ли?
ответ
Глядя на 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'
, который является правильным, как вы можете видеть.
Проблема в том, что я пытаюсь сопоставить поведение компилятора lua, который не будет компилировать 'ifj == 10thenprint ('j равно 10') end', поскольку ни ifj, ни thenprint не являются допустимыми ключевыми словами. – RCIX
Разбор 'ifj == 10thenprint ('j равно 10') end' не принимается как действительная инструкция if. Вам не нужно указывать пробелы между ними. Скрывать пробелы будет достаточно. –
Хорошо круто. Спасибо за помощь! – RCIX
У меня нет опыта работы с Lua, так что вы могли бы привести пример, когда пустое пространство нельзя игнорировать (или положить на '$ channel = HIDDEN')? Например, –
имеет значение if, которое выглядит следующим образом: 'if' * 'condition' *' then '*' block' * 'end', а пробелы важны для корректного чтения идентифицирующих слов. – RCIX