【发布时间】:2021-12-22 06:43:27
【问题描述】:
lexer = lex.lex()
precedence = (
('left', 'ADD', 'SUB'),
('left', 'MULTI', 'DIV'),
('left', 'RPAREN', 'LPAREN')
)
def p_expression_term(p):
'''
expression : term ENDOFLINE
| var_assign ENDOFLINE
| empty
'''
p[0] = p[1]
def p_expression_empty(p):
'empty : '
pass
def p_expression_add(p):
'term : term ADD term'
def p_expression_sub(p):
'term : term SUB term'
def p_term_multi(p):
'''term : term MULTI term '''
def p_term_div(p):
'''term : term DIV term'''
def p_term_pow(p):
'term : term POW term'
p[0] = pow(p[1], p[3])
def p_term_factor(p):
'term : factor'
p[0] = p[1]
def p_factor_num(p):
'factor : NUMBER'
p[0] = ['number' p[1]]
def p_expressionParenth(p):
'''term : LPAREN term RPAREN'''
p[0] = p[2]
pass
def p_var_assign1(p):
'''var_assign : NAME EQUAL NAME
| NAME EQUAL term
'''
p[0] = ast_tree.ast_name1(p[1], p[3])
def p_var_assignBe(p):
'''var_assign : LET NAME BE term'''
def p_var_assign3(p):
'''var_assign : NAME IDENTIFIER EQUAL term'''
# Error rule for syntax errors
def p_error(p):
print("Syntax error in input! at " + str(p))
# Build the parser
parser = yacc.yacc()
while True:
try:
s = '''let x be 12;'''
except EOFError:
break
if not s: continue
result = parser.parse(s)
result = ast_tree.fill_locations(result)
print(ast.unparse(result))
exit()
我正在尝试使用 python 的 ply 编写一个转译器,但我只能读取和转换一行代码。 这是我的 yacc 类代码。我目前正在解析 expression_term 方法中的代码。 我尝试了一些在 github 上找到的其他解决方案,但没有奏效。 我如何在一个输入中运行和解析多行你能给我一个代码 sn-p 来做到这一点吗? 谢谢。
【问题讨论】:
标签: python yacc lex transpiler ply