【问题标题】:I am trying to write a a transpiler with python's ply but i can only read and convert one line of a code我正在尝试用 python 的 ply 编写一个转译器,但我只能读取和转换一行代码
【发布时间】: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


    【解决方案1】:

    您的语法只接受一个表达式,因此解析器完全按照您的要求执行。如果你想让它解析多个表达式,你需要一个定义列表语法的语法。这可能看起来像这样:

    program : empty
            | program expression
    

    您必须从expression 中删除空产生式,因为多个连续的空对象是不明确的(空序列中有多少个空字符串?)。并且您需要确保program 是开始符号。

    【讨论】:

    • 非常感谢,我正在尝试这样做,但它只会给出无限递归错误。
    • @beton:这可能意味着您错过了基本情况 (program : empty)。
    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2019-10-26
    • 1970-01-01
    相关资源
    最近更新 更多