如何为if语句编写词法解析器和语法解析器?

3

由于我之前的问题没有得到答复,我现在重新提一个简短的问题:我需要帮助编写Python中if语句的解析器。以下是我的语言中if语句的示例:

IF 2 > 1 THEN
    OUT "Hello World!" // Print Statement
ENDIF

我已经解析了像这样的条件,并且它们返回 true 或 false:

elif toks[i] + " " + toks[i+1][0:3] + " " + toks[i+2] + " " + toks[i+3][0:3] + " " + toks[i+4] == "IF NUM EQEQ NUM THEN":
        if toks[i+1][4:] == toks[i+3][4:]:
            print("TRUE, " + toks[i+1][4:] + " is equal to " + toks[i+3][4:])
            return true

            i += 5
        else:
            print("FALSE, " + toks[i+1][4:] + " is not equal to " + toks[i+3][4:])
            return false

顺便说一下,这是为了平等而做的。不过我正在考虑改变这个,创建一个条件函数,然后在IF解析器中使用它。我遇到的唯一问题是如何跳过迭代器值并到达ENDIF语句... 有人能指导我如何在Python中编写if语句解析器吗,但不包括条件?


1
你是否查看过Python的实际源代码?https://www.python.org/downloads/source/ - beppe9000
2
为了不暴露实现的乐趣,我建议你研究一下由Dijkstra创建的"调度场算法"。结合二叉树构造(让你自己找到评估操作的二叉树方法),这将是简单语言实现和学习的最佳选择。 - Corvus Crypto
3
我正在编写一种语言,你可以在此处查看:https://github.com/kms70847/KevinScript!我使用了LR解析器,它很不错,因为它能够理解任意复杂的表达式,例如`if(1 > 2 and 3 < 4 and 5 + 6 * 7 >= f(8,9,10))`。但是,如果你只想限制条件语句为单个操作数-操作符-操作数三元组,那么你可能可以使用简单的递归下降解析器。 - Kevin
感谢大家的回复! - Willothy
1
词法分析和语法分析是非常复杂的主题。您应该深入研究@Kevin提供的链接。有大量现有文献可供参考。例如,深入了解递归下降分析和“文法”的概念。这将帮助您将IF / THEN / ENDIF的解析与条件表达式的解析分开。 - John Kugelman
@JohnKugelman 我很清楚这一点 :) 感谢大家,等我下课后我会尽快查看这些内容。 - Willothy
2个回答

2

我搞定了!虽然它非常原始且不支持嵌套(但还没有),我有一个简单的解决方案来解决我的问题。基本上,每当它检测到“IF”令牌时,它会循环遍历该令牌后面的所有令牌,直到找到“ENDIF”令牌为止。在执行此过程时,它会递增一个名为'ii'的迭代器,并在最后通过'ENDIF'将主迭代器设置为忽略if语句内的代码。仅当条件解析器返回false时才执行此操作。

代码:

def doIF_FALSE(tokens):
    ii = 0
    for token in tokens:
        if token == "IF":
            ii = 1
        elif token == "ENDIF":
            ii += 1
            break
        else:
            ii += 1
    return ii

对于这个调用,我将迭代器的值设置为:i = doIF_FALSE(tokens[i:])

示例代码:

IF 1 > 2 THEN
     OUT "1 is greater than 2"
ENDIF

OUT "You passed the if statement"

输出:

"You passed the if statement"

-1
elif toks[i]+" "+toks[i+1][0:3]+" "+toks[i+2][0:4]+" "+toks[i+3][0:3]+" "+toks[i+4][0:4]=="IF NUM EQEQ NUM THEN":
    if toks[i+1][4:]!=toks[i+3][4:]:
        print("false")
        break
    i+=5

2
你能添加一个简短的描述吗? - RtmY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接