у меня проблема с ply, я должен получить файл со списком токенов и грамматикой (bnf), я написал грамматику для распознавания ввода, и она почти работает (просто мелкие проблемы, мы их решаем), для пример это допустимый входной файл
#tokens = NUM PLUS TIMES
exp : exp PLUS exp | exp TIMES exp
exp : NUM
(в данном случае нас не волнует неоднозначная грамматика или что-то еще, это пример для ввода)
синтаксический анализ каждой строки по отдельности работает нормально, но я хочу проанализировать весь файл с помощью следующих правил:
- #tokens должны быть только в первой строке, поэтому, если у нас есть объявление #tokens после грамматики, оно недействительно
- у вас может быть 0 или более пустых строк после каждой строки «кода»
- у вас может быть столько правил грамматики, сколько вы хотите
я попытался использовать цикл для сканирования и анализа каждой строки отдельно, но я не могу контролировать первое (и действительно важное) правило, поэтому я попробовал это в своем файле .py:
я определил t_NLINEA (новая строка), у меня также была проблема с использованием символа \n в качестве литерала, и файл был открыт в режиме rU, чтобы избежать конфликтов по поводу символов \r\n или \n, поэтому я добавил эти правила:
def p_S(p):
'''S : T N U'''
print("OK")
def p_N(p): '''N : NLINEA N''' пройти
def p_N2(p): '''N : ''' пройти
def p_U(p): '''U : R N U''' пройти
def p_U2(p): '''U : ''' пройти
(как я уже говорил вам выше, я должен был использовать правило N, потому что ply не принимал литерал \n в моей грамматике, я добавил \n к переменной «литералы»)
T - это правило для анализа объявления #tokens, а R используется для анализа правил грамматики, T и R работают нормально, если я использую их в одной строке, но когда я добавляю продукты, которые я написал выше, я получаю синтаксическую ошибку при разборе первое грамматическое правило, например A : B C
я получаю синтаксическую ошибку с :
любое предложение? Спасибо