#1377·chroma

在 LexerState.Iterator 中出现无限循环,因为规则循环永远不会前进 Pos

作者: eugenioenko创建于 2026年9月11日更新于 2026年9月11日

列克萨斯州。 梯子 ' (regexp.go')没有防守与零宽相匹配并变异状态堆栈(push/pop)而不推进"Pos"的规则. 如果两个国家形成这样一个循环,Tokenise'/Iterator'就永远不会返回——而不是缓慢,最终也不符合要求,一个无条件的无限循环,一个CPU核心以100%旋转.

这是一种与#410不同的失败模式(灾难雷克克斯在单对齐内进行回溯跟踪,由每个规则的"MatchTimeout"所固定). 在这里,每个单独的regex匹配以微秒完成——outer循环是永不终止的,所以"MatchTimeout"没有帮助.

  • 根由(同化,不依赖任何捆绑的来历)

开始 lexer:= must NewLexer(t, & Config{ Name: "loopy" ), Rules{ 规则 "root":"(?=\S)',"无","push ("a")". "":"(?=\S)","无","推"("b")". "b":"{{``","无","流行"(1)}}". ) (中文(简体) ). lexer.tokenise(无,"x") /.tokens () 永远不返回


`根'将`a'推向零宽的外观;`a'将`b'推向同样的方式;`b'无条件、无规律的规则又回到`a'。 每个步骤都是一个有效、成功、零相距的对接,因此,从来没有发生过错误——`Pos'只是永远不离开0,而堆积物永远是`[root,a] ' [root,a,b]。 `Iterator' (` for l. Pos < end QQ len (l. Stack) > 0') 中的循环条件没有检查“自从上次我们到达这个堆栈深度以来`Pos'是否移动了”。

QQ 真实世界触发器:被捆绑的丛林词典

`lexers/embed/jugle.xml''的`指示'将`var'推到`(?-----------------');`var'的 " 包罗万象的规则 " (没有模式--总是匹配,0-width)在`var'的具体规则没有匹配时又回到`指示'。 `var ' 仅消耗`;[() $'或`[a-zA-Z-]\w*`-任何其他字符直接进入上述周期。

开始
lx:=likers.Get ("琼格尔").
lx. kenise( 无, "/" ) / 从不返回

已确认悬挂(有一个活地出轨的垃圾场显示匹配规则'/regexp2' 正在旋转,而不是被屏蔽)于:

  • /、`、``、```-其中任何一种单独存在
  • 标记v2.24.1'和目前的v2'分枝尖(976b215')——相同的jungle.xml',相同的`Iterator'环形
  • " 主要 " /v3(语法相同,引擎逻辑相同)

** 实际影响:** 任何称为`lexers'的消费者。 火柴() " / " 折射器。 Get("Jungle")' on a file complete QQ. jungle", 并且象征它永久地挂起内容包含其中某个字符的时刻——对于真正的"丛林"(Garmin ConnectIQ)来源来说,这几乎是不可避免的. 我们通过一个Go TUI编辑器点击了这个,该编辑器在文件打开时同步构建出一个 " 高亮 " 。

JSONata 独立触发器

将每个捆绑的出税器(lexers. 名字(假名)',~200+)与每个可打印的ASCII字符,可打印的拉丁扩展-A/B字符,以及少数短的常见符号(QQ,"->","["等)相抗衡,每个符号都有按输入计时. " Jungle " (以上)和 " JSONata " 。

JSONata'语法(lexers/embeded/jsonata.xml')是同一缺陷的一个simpler变体:一个州,不 . . . . . . .

内容来源: alecthomas/chroma