Комические 303 XKCD - "Компиляция"
('Вы крадете те LCDs?' 'Да, но я делаю его, в то время как мои компиляции кода)
у меня есть прикрепленный к стене, стоящей перед входом в наш офис:)
Я бы позволил вашему токенизатору делать тяжелую работу, а не смешивать правила новой строки в вашей грамматике:
Считайте круглые скобки, квадратные скобки и фигурные скобки и не генерируйте токены NL, пока есть незамкнутые группы. Это даст вам бесплатные продолжения строк, даже если ваша грамматика не станет мудрее.
Всегда генерируйте токен NL в конце файла независимо от того, заканчивается ли последняя строка символом '\ n'
, то вам не нужно беспокоиться об особом случае утверждения без NL. Утверждения всегда заканчиваются NL.
Второй пункт позволит вам упростить вашу грамматику примерно так:
exprlist
: ( assignment_statement | empty_line )* EOF!
;
assignment_statement
: assignment NL
;
empty_line
: NL
;
assignment
: ID '=' expr
;
Как насчет этого?
exprlist
: (expr)? (NL+ expr)* NL!? EOF!
;
expr
: assignment | ...
;
assignment
: ID '=' expr
;