Tiny python добавить правило пропуска пустой строки, Antlr4 - PullRequest
0 голосов
/ 26 мая 2020

Я использую https://github.com/antlr/grammars-v4/blob/master/python/tiny-python/tiny-grammar-without-actions/Python3.g4

грамматику, и я хочу добавить правило пропуска пустой строки (строка: 6)

a = 0
b = 2
sum = 0
if b > a:
    i = b

    sum += i
print(sum)

У меня есть протестировать этот код, но у меня не работает

WS:[ \t\r\n]+ -> skip;
line 8:4     : missing NEWLINE at 'sum'

Изменить:

ss = 4
if 3>1:
    ss = 3
    #dddd
    ss = 4

когда я добавляю код выше, он сообщит о другой ошибке

line 4:9 : extraneous input '\n ' expecting {'break', 'continue', 'if', 'while', 'for', 'print', 'def', 'return', NAME, '(', DEDENT}

1 Ответ

1 голос
/ 26 мая 2020

Выполняя WS:[ \t\r\n]+ '\n'-> skip;, вы по существу удаляете (пропускаете) новую строку после i = b и пустую строку после нее:

i = b

sum += i

, что приводит к следующему:

i = b sum += i

, что не годится: вам нужна новая строка после i = b.

Вместо того, чтобы пропускать пустые строки, вы можете попытаться разрешить пустые строки быть частью вашего токена NEWLINE. Поэтому вместо:

NEWLINE
 : ( '\r'? '\n' | '\r' | '\f' ) SPACES?
 ;

вы должны сделать:

NEWLINE
 : ( '\r'? '\n' | '\r' | '\f' ) (SPACES? ( '\r'? '\n' | '\r' | '\f' ))* SPACES?
 ;

, что позволит убедиться, что новая строка после i = b не будет удалена.

...