Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式是分析语法的一种可接受的方法吗?_Python_Regex_Parsing_Interpreter_Lexer - Fatal编程技术网

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

Python 正则表达式是分析语法的一种可接受的方法吗?,python,regex,parsing,interpreter,lexer,Python,Regex,Parsing,Interpreter,Lexer,如果这个问题对某些人来说很明显,请原谅,但我正在努力自学如何编写口译员。我正在用python做这件事,我已经编写了一个Lexer 我已经创建了我的令牌列表,我陷入了构建解析树的困境。我对今后的方向有点想法,但我不确定我的想法是否正确 这是我在语法中为使用正则表达式的简单算术表达式定义的语法 <a_expression> = <identifier | number> <operator> <identifier | number> = 但是,如

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

我已经创建了我的令牌列表,我陷入了构建解析树的困境。我对今后的方向有点想法,但我不确定我的想法是否正确

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

<a_expression> = <identifier | number> <operator> <identifier | number>
=
但是,如果我的解析器从我的lexer接收到与此模式匹配的令牌流:

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

既然它有两个运算符和三个操作数,而不是两个操作数,我该如何解析它呢


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

正则表达式是否适合解析您的语法,取决于您的语法(即语法)是否也是正则的,或者是否属于另一个Chomsky类

对于类型-0(无限制)语法,您将需要一台图灵机

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

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

正则表达式(或以上任何一种)只能读取type-3(正则)


例如,你可以在维基百科上找到。

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

对于类型-0(无限制)语法,您将需要一台图灵机

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

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

正则表达式(或以上任何一种)只能读取type-3(正则)


例如,你可以在维基百科上找到。

虽然今天的“正则”表达式并没有严格地归为“正则”表达式,但你会发现你需要一个更强大的工具来完成你想做的事情


上下文无关语法是您所需要的,并且有一些用于在Python中编写CFG的工具。最值得注意的是,Haskell的Parsec库中有一个名为Pysec的端口,您也可以查看它

虽然今天的“正则”表达式并没有严格地归为一种语言,但您会发现,您需要一种更强大的工具来完成您想要做的事情


上下文无关语法是您所需要的,并且有一些用于在Python中编写CFG的工具。最值得注意的是,Haskell的Parsec库中有一个名为Pysec的端口,您也可以查看它

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

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

然而,许多非规则语言并不需要CFG的全部功能

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


您的语言符合LR(1)中更严格的子集。事实上,顾名思义(“OP”是“操作符优先级”的缩写),这就是范例。而OP解析器比一般的解析器更容易手工编写。因此,如果您要从头开始构建自定义解析器,这可能是您在这里想要使用的。

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

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

然而,许多非规则语言并不需要CFG的全部功能

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


您的语言符合LR(1)中更严格的子集。事实上,顾名思义(“OP”是“操作符优先级”的缩写),这就是范例。而OP解析器比一般的解析器更容易手工编写。因此,如果您打算从头开始构建自定义解析器,这可能是您在这里想要使用的。

正则表达式是否适合解析您的语法,取决于您的语法(即语法)是否也是正则的,或者是否属于另一个Chomsky类(无上下文等)。对于0型语法,您需要一个图灵机;对于1型,您需要一个线性有界自动机;对于2型,您需要一个下推自动机;只有3型才能被正则表达式读取。@Hyperboreus:完美答案;你应该把它作为一个答案发布(理想的情况是在上面再做进一步的解释,一个非正则语法的例子,一些链接等等)。正则表达式是否适合解析你的语法,取决于你是否