ruby - 在使用正则表达式匹配字符串的递归下降解析器中计算行数?

标签 ruby regex parsing parser-combinators recursive-descent

我正在用 Ruby 编写递归下降解析器,它使用正则表达式来匹配终端。终端实际上​​是正则表达式,并与字符串中的当前位置匹配。

问题是终端正则表达式可以包含任何内容,包括匹配换行符的正则表达式。例如,匹配括号 /\([^\)]*\)/ 之间任何内容的终端将消耗空格,包括我需要计算的换行符。我提出了几种解决方案,但它们都有我不太喜欢的缺点:

  1. 每当终端被匹配时,计算匹配中出现的所有\n。这实际上意味着每个字符串匹配两次而不是一次,

  2. 我可以不存储当前行,而是存储字符串的当前位置,并仅在需要时通过遍历字符串获取行号和列号。显然有问题,因为每次需要行号时都会遍历整个字符串。

  3. 不是允许正则表达式作为终端,我可以允许一种更简单的匹配器形式,类似于 ANTLR 允许的,然后手动匹配字符串,计算换行符。但是,这需要大量的额外工作,并且会损失正则表达式的匹配能力。

我倾向于第三种解决方案,但是我想看看是否有人处理过类似的问题并且有更好的解决方案可以省去我的麻烦。

最佳答案

您可以使用您的解决方案 2,但使用源文件的“行索引”。

您进行第一个阶段以获取线条开始位置的数组。然后,您可以通过二进制搜索(n 是行数)获得 O(log n) 中某个位置的行号。 顺便说一下,它还可以让您在 O(1) 上获得 pos - lines_start[line] 行中的位置,这对于重要代码行的错误报告非常宝贵.

关于ruby - 在使用正则表达式匹配字符串的递归下降解析器中计算行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20174147/

相关文章:

ruby-on-rails - 如何将文本合并在一起?就像版本控制系统一样?

Ruby 动态数组 : undefined local variable or method `s' for main:Object (NameError)

c - 如何用 C 语言从字符串中解析 IP 地址?

Rubygems:可以在 gem 分发中使用符号链接(symbolic link)吗?

ruby-on-rails - 设计:UncaughtThrowError - 未捕获的 throw :warden

php - 匹配单词,然后匹配潜在的括号字符串,然后匹配潜在的方括号字符串

c# - 正则表达式特周

regex - SED:将现有模式插入同一行的其他几个地方

javascript - JavaCC中如何实现JavaScript自动插入分号?

java - 使用 Java Swing 获取 DIV 内容