如何更改规则的解析顺序?
How do I change the parsing order of the rules?
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(这是错误的,因为表达式评估为假)。我正在处理这个计算条件块的问题:
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(p2)的值添加到字典中对应的块索引中。问题是当我开始做作业时:
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])
被评估的块是默认的 "out-of-block-scope"。赋值规则在表达式之前被解析/处理,这在我看来毫无意义,因为整个代码应该从头到尾处理。
我显然不是解析/YACC 方面的专家,这是我的第一次尝试,我完全找不到要做什么的提示 in the docs。我不知道如何停止解析器、跳过解析器、更改解析顺序...也许问题出在我的语法中,但我看不到如何更改解析顺序。
当产生式被减少时——也就是说,它的语义动作被执行——所有被引用的non-terminals都已经被减少了。换句话说,children 总是在它们的 parents 之前减少,这就是为什么 yacc 被称为 bottom-up 解析器。
获得更大灵活性的唯一实用方法是在解析期间构建 AST,然后通过在 AST 上执行树遍历来评估(或其他)完整的表达式。然后您可以按照任何合适的顺序自由地遍历整棵树。
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(这是错误的,因为表达式评估为假)。我正在处理这个计算条件块的问题:
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(p2)的值添加到字典中对应的块索引中。问题是当我开始做作业时:
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])
被评估的块是默认的 "out-of-block-scope"。赋值规则在表达式之前被解析/处理,这在我看来毫无意义,因为整个代码应该从头到尾处理。
我显然不是解析/YACC 方面的专家,这是我的第一次尝试,我完全找不到要做什么的提示 in the docs。我不知道如何停止解析器、跳过解析器、更改解析顺序...也许问题出在我的语法中,但我看不到如何更改解析顺序。
当产生式被减少时——也就是说,它的语义动作被执行——所有被引用的non-terminals都已经被减少了。换句话说,children 总是在它们的 parents 之前减少,这就是为什么 yacc 被称为 bottom-up 解析器。
获得更大灵活性的唯一实用方法是在解析期间构建 AST,然后通过在 AST 上执行树遍历来评估(或其他)完整的表达式。然后您可以按照任何合适的顺序自由地遍历整棵树。