Я пытаюсь написать базовый язык программирования.Я использую RPLY для lexing и разбора.Я написал 4 токена, необходимых для присвоения значения переменной:
self.lexer.add('INT', r'd+')
self.lexer.add('STRING', r'"[^"]*"')
self.lexer.add('ASSIGN', r'\=')
self.lexer.add('IDENT', r'[a-zA-Z_][a-zA-Z\d_]*')
Мой генератор синтаксического анализа принимает эти токены
self.pg = ParserGenerator(
# A list of all token names accepted by the parser.
['NUMBER', 'PRINT', 'OPEN_PAREN', 'CLOSE_PAREN',
'SEMI_COLON', 'SUM', 'SUB', 'MUL', 'INT', 'STRING', 'IDENT', 'ASSIGN'],
precedence=[
('left', ['SUM','SUB']),
('left', ['STRING', 'IDENT', 'ASSIGN'])
]
)
Вот пример создания переменной
@self.pg.production('identifier : STRING IDENT ASSIGN expression')
@self.pg.production('identifier : INT IDENT ASSIGN expression')
def identifier(p):
return p
И когда я пытаюсь запустить его, я получаю эту ошибку:
Traceback (most recent call last):
File "main.py", line 21, in <module>
parser.parse(tokens).eval()
File "/xxx/xxx/anaconda3/lib/python3.7/site-packages/rply/parser.py", line 60, in parse
self.error_handler(lookahead)
File "/home/xxx/xxx/Project/parser.py", line 53, in error_handle
raise ValueError(token)
ValueError: Token('IDENT', 'string')
Входной файл:
string oki = "ssds"
print(oki);
Он анализирует строку в IDENT, где строка должна быть проанализирована в токене STRING.вместо.Приоритет установлен, но, может быть, он его не распознает?