Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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
Java 如何构建正则表达式的最佳AST?_Java_Regex_Parsing_Abstract Syntax Tree - Fatal编程技术网

Java 如何构建正则表达式的最佳AST?

Java 如何构建正则表达式的最佳AST?,java,regex,parsing,abstract-syntax-tree,Java,Regex,Parsing,Abstract Syntax Tree,我正试图通过从头构建抽象语法树(没有任何项目依赖项或工具,如Java中的cup解析器等)来构建正则表达式的解析器。我不想保存正则表达式中包含的所有信息,而是希望尽可能地简化它 例如,x::=y | z应导致与字符类x::=[yz]相同的AST。然而,由于正则表达式可能(而且确实)变得非常复杂,我无法决定要实现什么等价物。例如,我不知道如何保存否定选择x:=[^b],这相当于x:=a | c | d | e |…… 你会做什么抽象?这些抽象中的一些会导致以后错误的AST吗?AST表示解析的特定程序

我正试图通过从头构建抽象语法树(没有任何项目依赖项或工具,如Java中的cup解析器等)来构建正则表达式的解析器。我不想保存正则表达式中包含的所有信息,而是希望尽可能地简化它

例如,
x::=y | z
应导致与字符类
x::=[yz]
相同的AST。然而,由于正则表达式可能(而且确实)变得非常复杂,我无法决定要实现什么等价物。例如,我不知道如何保存否定选择
x:=[^b]
,这相当于
x:=a | c | d | e |……


你会做什么抽象?这些抽象中的一些会导致以后错误的AST吗?

AST表示解析的特定程序的语法(在OP的例子中,是“regex”)。通常AST是从一个实际的解析树派生出来的,它记录了输入程序的特定分解

OP建议他需要一个AST,它表示与字符类相同的字符交替。他似乎把“等价”或“规范”形式与特定的解析混淆了

通常,如果分解被规范化,可能会有不同的输入字符串、明显不同的解析树和相同的AST。这并不总是容易做到的。你可能会发现一些简单的例子(OP的例子就是其中之一),在这些例子中,可以为语言的一部分定义一个规范形式,并强制将等价的构造转换为该规范形式。一般来说,并不总是保证可以从任意等价的规范生成规范


或者,正如OP所建议的那样,您可能已经尝试选择了一个quandry:将[^x]表示为127个ASCII替代项的显式集合是否更好?您应该为[^]选择什么?[^]? [^你应该把字符类分开。考虑一下:Unicode定义了超过120个字符,所以<代码> [^ b] < /Code >将代表一个大约有120个成员的交互。这对于AST没有任何好处。