regex - JFlex:正则表达式中的负前瞻

标签 regex jflex wolfram-language

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

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

所以当它后面跟着另一个 . 时,数字不会吃掉 .,因为在 Wolfram 语言中,这两个点会被解析作为运营商叹息

我有prepared an example基本上将整个数字表示显示为一个普通的正则表达式,包含否定的前瞻性并包含示例数字。

谁能告诉我如何在 JFlex 中做到这一点?

img

这里是相关的 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/

相关文章:

python - 从文本 + python 正则表达式中提取行

java - 特定的java正则表达式

java - JFlex 扫描仪 ArrayIndexOutOfBoundsException : 769

java - JFlex 中可以继承吗?

wolfram-language - True 在此 Wolfram 输出中意味着什么?

c++ - 在 flex、bison、c++ 中实现 Wolfram 语言

javascript - 更改 div 中包裹的字符串特定部分的颜色

python - 使用正则表达式提取电话号码,后面或前面没有数字

Java System.in、换行符和解析命令行

wolfram-mathematica - 打印 Grid with list in list 作为 Wolfram Alpha 的输出