Учитывая следующую грамматику:
expr : expr '+' term | expr '-' term | term
term : term '*' factor | term '/' factor | factor
factor : '(' expr ')' | identifier | number
Это мой код с использованием слоя:
from ply import lex, yacc
tokens = [
"identifier",
"number",
"plus",
"minus",
"mult",
"div"
]
t_ignore = r" \t"
t_identifier = r"^[a-zA-Z]+$"
t_number = r"[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?"
t_plus = r"\+"
t_minus = r"-"
t_mult = r"\*"
t_div = r"/"
def p_stmt(p):
"""stmt : expr"""
p[0] = ("stmt", p[1])
def p_expr(p):
"""expr : expr plus term
| expr minus term
| term"""
p[0] = ("expr", p[1], p[2]) # Problem here <<<
def p_term(p):
"""term : term mult factor
| term div factor
| factor"""
def p_factor(p):
"""factor : '(' expr ')'
| identifier
| number"""
if __name__ == "__main__":
lex.lex()
yacc.yacc()
data = "32 + 10"
result = yacc.parse(data)
print(result)
Как я должен построить AST с выражением, если я не могу получить доступ к операторам? Я мог бы разделить функции, такие как p_expr_plus, но в этом случае я бы исключил приоритет операций. документы не очень полезны, так как я новичок и не могу решить эту проблему проблема. Лучший материал, который я нашел на эту тему, это, но он не рассматривает сложность приоритета операторов.
РЕДАКТИРОВАТЬ: я не могу получить доступ к p2 или p[3], так как я получаю IndexError (соответствует только термину). В PDF-файле, на который я ссылаюсь, они явно помещают оператор внутри кортежа, например: ('+', p1, p2), и, таким образом, демонстрируя мою проблему с учетом приоритет (я не могу разделить функции, выражение есть выражение, должен быть способ рассмотреть каналы и получить доступ к любому оператору).