python - 如何更改规则的解析顺序?

标签 python parsing yacc ply

I'm developing a programming language ,而且我在处理条件语句时遇到了麻烦。这是我的语言的代码:

x = 4 ->
? 2 > 5 <?
    x = 7 -> 
?> ->
[o] <- x ->

这是定义条件语句的语法的特定部分:

post_condition_evaluation_block : post_condition_evaluation_block_opening_operator compound_statement post_condition_evaluation_block_closing_operator
condition_statement : condition_specification_operator expression post_condition_evaluation_block
                    | condition_specification_operator expression post_condition_evaluation_block condition_extension

实际上语法没有问题,代码运行正常。问题是表达式 2 > 5 后面的语句 x = 7 之后被求值,所以打印出来的是 7 而不是 4 (这是错误的,因为表达式的计算结果为 false)。我正在处理这个计算条件 block 的问题:

condition_blocks = {0: True}
current_condition_block = 0

然后说到条件语句:

def p_condition_statement(p):
    """condition_statement : condition_specification_operator expression post_condition_evaluation_block
                           | condition_specification_operator expression post_condition_evaluation_block condition_extension"""
    global current_condition_block
    current_condition_block += 1
    condition_blocks[current_condition_block] = p[2]
    print(condition_blocks)

它将表达式的 False (p 2 ) 值添加到字典中相应的 block 索引中。问题是当我开始做作业时:

def p_assignment(p):
    """assignment : identifier assignment_operator expression"""
    if len(p) == 4 and condition_blocks[current_condition_block]:
        if p[2] == '=':
            identifiers[p[1]] = parse_object(p[3])
        elif p[2] == "+=":
            identifiers[p[1]] += parse_object(p[3])
        elif p[2] == "-=":
            identifiers[p[1]] -= parse_object(p[3])
        elif p[2] == "*=":
            identifiers[p[1]] *= parse_object(p[3])
        elif p[2] == "/=":
            identifiers[p[1]] /= parse_object(p[3])
        p[0] = (p[1], p[2], p[3])

被评估的 block 是默认的“ block 范围外” block 。赋值规则在表达式之前被解析/处理,这在我看来毫无意义,因为整个代码应该从头到尾处理。

我显然不是解析/YACC 方面的专家,这是我的第一次尝试,我完全找不到要做什么的提示 in the docs .我不知道如何停止解析器、跳过解析器、更改解析顺序...也许问题出在我的语法中,但我看不到如何更改解析顺序。

最佳答案

当一个产生式被缩减时——也就是说,它的语义 Action 被执行——所有被引用的非终结符都已经被缩减了。换句话说, child 总是在他们的 parent 之前减少,这就是为什么 yacc 被称为自下而上的解析器。

获得更大灵 active 的唯一实用方法是在解析期间构建 AST,然后通过在 AST 上执行树遍历来评估(或其他)完整的表达式。然后您可以按照任何合适的顺序自由地遍历整棵树。

关于python - 如何更改规则的解析顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39031596/

相关文章:

python - 如何使用python在redis中创建嵌套结构?

c++ - 简单的语义 Action 破坏了 Spirit X3 中的结果

java - 需要有关在 Java 中解析重复项的建议

c++ - 制作可重入解析器的错误

yacc - 一个程序中的多个 YACC 语法

python - 查找两个列表的所有可能组合

python - 在 pytables 中组合 read_sorted 和 Expr 的最有效内存方式是什么?

python - 如何将python项目部署到没有安装一些第三方库的环境中?

java - Java 有哪些 HTML 解析库推荐

c - 段错误(核心转储)调用 mknode 函数时出错