正则表达式是分析语法的可接受方法吗?



如果这个问题对某些人来说很明显,请原谅我,但我正在尝试自学如何编写口译员。我正在用python做这件事,我已经编程了一个Lexer。

我已经创建了令牌列表,我卡在的地方是构建解析树。我有点想法从这里开始,但我不确定我的想法是否正确。

这是我在语法中为使用正则表达式的简单算术表达式定义的语法。

<a_expression> = <identifier | number> <operator> <identifier | number>

但是,如果我的解析器从我的词法分析器收到与此模式匹配的令牌流:

<identifier | number> <operator> <identifier | number> <operator> <identifier | number>

我该如何解析它,因为它有两个运算符和三个操作数,而不仅仅是两个操作数?

此外,如何处理 n 个操作数和 n-1 个运算符?我觉得这应该递归完成,但我不确定我是否需要为不同类型的表达式定义更多的解析器或从这里开始。我可以将 n 个操作数和 n-1 运算符的模式与正则表达式匹配吗?

虽然今天的"常规"表达并没有严格归入常规语言的土地,但你会发现你需要一个更强大的工具来做你想做的事情。

上下文无关语法是你想要的,并且有一些工具可以在Python中编写CFG。最值得注意的是pyparsing,但Haskell的Parsec库有一个名为Pysec的端口,你也可以研究一下。

正则表达式是否适合解析你的语法,取决于你的语法(即你的语法)是否也是正则的,还是另一个乔姆斯基类的。

对于 0 型(无限制)语法,您将需要图灵机。

对于类型 1(上下文相关),您将需要一个线性有界自动机(或以上任何一种)。

对于类型 2(上下文无关),您将需要一个下推自动机(或以上任何一种)。

只有类型3(常规)可以被正则表达式(或上述任何一种)读取。

您可以在维基百科上找到更多阅读材料。

带优先级的中缀算术不是常规语言。正则表达式仅适用于解析常规语言。(现代正则表达式实现实际上不仅仅是正则表达式,它们实际上可以解析大多数上下文无关语言......但是对于其中一些人来说,它们需要指数级的时间,而且预测哪些是微不足道的。

但它是一种上下文无关的语言。有关简要说明,请参阅维基百科关于上下文无关语法的文章。上下文无关语法适用于解析常规语言和上下文无关语言。

但是,许多非常规语言不需要CFG的全部功能。

两个重要的类是那些可解析LL或LR的类(线性时间)。(这些的变体,特别是LALR和SLR,也很重要。例如,Python 可以(至少在参考实现中)由 LL(1) 解析器解析。

你的语言适合LR(1)的一个更严格的子集,OP。事实上,顾名思义("OP"是"运算符优先级"的缩写),这是范例案例。OP 解析器比更通用的解析器更容易手写。因此,如果您要从头开始构建自定义解析器,那么您可能希望在此处使用。

最新更新