首页 > 解决方案 > JFlex:正则表达式中的负前瞻

问题描述

我的问题可以分解为以下可能发生在大型正则表达式中的问题:1.是一个数字,但是是由数字和运算符1..组成的两个标记。1..

Wolfram 语言中数字的定义非常复杂(我在末尾附加了 JFlex 代码),我基本上需要(?!...)深度嵌套结构中的运算符。但是,JFlex 似乎仅在“规则”基础上支持负前瞻,这意味着我需要手动扩展我的定义。

所以想要的是数字不吃.,当它后面跟着另一个 时.,因为在 Wolfram 语言中,这两个点然后被解析为运算符sigh

准备了一个示例,该示例基本上将整个数字表示形式显示为普通正则表达式,包含负前瞻并包含示例数字。

有人能告诉我如何在 JFlex 中做到这一点吗?

图像

这是相关的 JFlex 代码,完整的定义可在此处获得

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; }

标签: regexjflexwolfram-language

解决方案


目前尚不清楚这在您的情况下是否可行,但我对此类问题的第一反应通常是尝试将其从词法分析器上移到一个级别。NUMBER即,我将返回一个数字的组成部分,而不是词法分析器标记,例如{Digits},、、等".""^^"然后将它们放在解析器的语法中(如果有的话),或者在调用的解析引擎中词法分析器。

顶部的通常 LR 或 LL 引擎可以更好地处理前瞻和上下文,即在您的示例中,下面的所有内容Base可能已经进入解析器而不是词法分析器。

至少如果您想进一步计算数字的值,无论如何您都需要更详细地分析匹配的文本以获取数字,因为它非常复杂,所以从那个角度来看,您不会丢失任何东西。


推荐阅读