【发布时间】:2016-06-17 09:38:55
【问题描述】:
我正在尝试通过从头开始构建抽象语法树来构建正则表达式解析器(没有任何项目依赖项或工具,例如 Java 中的杯子解析器等)。我不想保存正则表达式中包含的所有信息,而是想尽可能地简化它。
例如,x::=y|z 应该导致与字符类x::=[yz] 相同的 AST。但是,由于正则表达式可以(并且确实)变得非常复杂,我无法决定要实现哪些等价。比如我不知道如何保存否定选择x::=[^b],相当于x::=a|c|d|e|...
你会做什么抽象?这些抽象中的一些会在以后导致错误的 AST 吗?
【问题讨论】:
-
您应该将字符类分开。考虑一下:Unicode 定义了超过 120k 个字符,因此
[^b]将代表大约 120k 个成员的交替。这对 AST 没有任何好处。
标签: java regex parsing abstract-syntax-tree