【发布时间】:2013-09-12 20:39:55
【问题描述】:
如果这个问题对某些人来说很明显,请原谅我,但我正在尝试自学如何编写解释器。我在 python 中执行此操作,我已经编写了 Lexer。
我已经创建了我的令牌列表,但我遇到的问题是构建解析树。我对从这里去哪里有了某种想法,但我不确定我的想法是否正确。
这是我在语法中为使用正则表达式的简单算术表达式定义的语法。
<a_expression> = <identifier | number> <operator> <identifier | number>
但是,如果我的解析器从我的词法分析器接收到与此模式匹配的标记流:
<identifier | number> <operator> <identifier | number> <operator> <identifier | number>
我该如何解析这个,因为它有两个运算符和三个操作数,而不是只有两个操作数?
此外,如何处理 n 个操作数和 n-1 个运算符?我觉得这应该递归地完成,但我不确定是否需要为不同类型的表达式定义更多解析器或从这里开始。我可以将 n 个操作数和 n-1 个运算符的模式与正则表达式匹配吗?
【问题讨论】:
-
一个正则表达式是否适合解析你的语法,取决于你的语法(即你的语法)是否也是正则的,或者另一个 Chomsky 类的(上下文无关等)。对于 type-0 语法,您需要一台图灵机,对于 type-1 需要一个线性有界自动机,对于 type-2 需要一个下推自动机,并且只有 type-3 可以被正则表达式读取。
-
@Hyperboreus:完美答案;您应该将其作为答案发布(最好通过更多解释、非常规语法示例、一些链接等对其进行扩展)。
标签: python regex parsing interpreter lexer