请原谅我这个问题对某些人来说是显而易见的,但我正在努力教自己如何写一个翻译。我在python中这样做,我已经有一个Lexer编程。
我已经创建了我的令牌列表,其中我被困在构建解析树。我有点想知道从哪里开始,但我不确定我是否正确思考。
这是我在语法中为使用正则表达式的简单算术表达式定义的语法。
<a_expression> = <identifier | number> <operator> <identifier | number>
但是,如果我的解析器从我的词法分析器收到一个匹配此模式的标记流:
<identifier | number> <operator> <identifier | number> <operator> <identifier | number>
我如何解析这个,因为它有两个运算符和三个操作数而不是两个操作数?
此外,我如何处理n个操作数和n-1个运算符?我觉得这应该以递归方式完成,但我不确定是否需要为不同类型的表达式定义更多的Parsers或从何处开始。我可以将n个操作数和n-1个运算符的模式与正则表达式匹配吗?
答案 0 :(得分:2)
正则表达式是否易于解析语法,取决于您的语法(即语法)是否也是常规的,或者是否是另一个乔姆斯基类。
对于0型(不受限制的)语法,您需要一台图灵机。
对于类型1(上下文相关),您将需要一个线性有界自动机(或上述任何一个)。
对于类型2(无上下文),您将需要一个下推自动机(或上述任何一种)。
只有正则表达式(或任何上述内容)才能读取类型-3(常规)。
您可以找到further readings,例如在维基百科。
答案 1 :(得分:2)
虽然今天的'常规'表达并没有严格降级到Regular Languages,你会发现你需要一个更强大的工具去做你想要做的事情。
无上下文语法是你想要的,并且有一些用于在Python中编写CFG的工具。最值得注意的是pyparsing,但是有一个Haskell的Parsec库的端口叫做Pysec,你也可以查看。
答案 2 :(得分:1)
具有优先权的中缀算术不是常规语言。正则表达式仅适用于解析常规语言。 (现代正则表达式实现并不仅仅是正则表达式,它们实际上可以解析大多数无上下文的语言......但是它们会对其中一些语言采用指数时间,并且预测哪些是非常重要的。)
但它是一种无语境的语言。有关简要说明,请参阅Context-free grammar上的维基百科文章。无上下文语法适用于解析常规语言和无上下文语言。
但是,许多非常规语言不需要CFG的全部功能。
两个重要的类是那些LL - 或LR - 可解析的(线性时间)。 (这些变体,特别是LALR和SLR,也很重要。)例如,Python可以(并且至少在参考实现中)由LL(1)解析器解析。
您的语言符合LR(1)OP更严格的子集。实际上,顾名思义(“OP”是“运算符优先”的缩写),它就是范例。与一般的解析器相比,OP解析器更容易手动编写。因此,如果您要从头开始构建自定义解析器,那么您可能希望在此处使用它。