我的问题可以分解为以下可能发生在大型正则表达式中的问题:1.
是一个数字,但 1..
是两个标记,由 1
作为数字和 ..
作为运算符组成。
Wolfram 语言中数字的定义非常复杂(我在最后附加了 JFlex 代码)并且我基本上需要在深度嵌套的构造中使用 (?!...)
运算符。但是,JFlex 似乎仅基于“规则”支持负前瞻,这意味着我需要手动扩展我的定义。
所以想要的是数字不吃 .
,当它后面跟着另一个 .
时,因为在 Wolfram 语言中,这两个点然后被解析为运算符叹气。
我有 prepared an example,它基本上将整个数字表示显示为普通正则表达式,包含负前瞻并包含示例数字。
有人能告诉我如何在 JFlex 中做到这一点吗?
这是相关的 JFlex 代码,完整的定义可用 here
Digits = [0-9]+
Digits2 = [0-9a-zA-Z]+
Base = 2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36
Number = {Digits}((\.){Digits}?)? | \.{Digits}
PrecisionNumber = {Number}`((`?){Number})?
BaseNumber = {Base} "^^" {Digits2}(\.{Digits2}?)?
BasePrecisionNumber = {BaseNumber}((`{Number}?)|(``{Number}))
ScientificInteger = {Number} "\*^"(-?){Digits}
ScientificNumber = {PrecisionNumber} "\*^"(-?){Digits}
BaseScientificNumber = {BasePrecisionNumber} "\*^"(-?){Digits}
{BaseScientificNumber}|
{BasePrecisionNumber}|
{ScientificInteger}|
{BaseNumber}|
{ScientificNumber}|
{PrecisionNumber}|
{Number} { return WLElementTypes.NUMBER; }
最佳答案
目前尚不清楚这在您的情况下是否可行,但我对此类问题的第一 react 通常是尝试将其从词法分析器上移到一个级别。 IE。而不是词法标记 NUMBER
,我会返回一个数字的组成部分,例如{Digits}
、 "."
、 "^^"
等,然后将它们放在解析器的语法中(如果有的话),或者在调用词法分析器的解析引擎中。
顶部的普通 LR 或 LL 引擎可以更好地处理前瞻和上下文,即在您的示例中,Base
下面的所有内容可能已经进入解析器而不是词法分析器。
至少如果你想用数字的值进一步计算,无论如何你都需要更详细地分析匹配文本的数字,因为它太复杂了,所以从这个角度你不会丢失任何东西。
关于regex - JFlex:正则表达式中的负前瞻,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54905084/