scala - scala StdLexical 中的 Lexing 换行符?

标签 scala newline lexer parser-combinators

我正在尝试 lex(然后解析)类似 C 的语言。在 C 语言中有预处理器指令,其中换行符很重要,然后是实际代码,它们只是空格。

这样做的一种方法是像早期的 C 编译器一样执行两次过程 - 为 # 指令设置一个单独的预处理器,然后对它的输出进行 lex。

但是,我想知道是否有可能在单个词法分析器中完成。我很高兴编写 scala 解析器组合器代码,但我不太确定 StdLexical 如何处理空格。

有人可以写一些简单的示例代码来解释 #include 行(使用换行符)和一些简单的代码(忽略换行符)吗?或者这是不可能的,最好采用 2-pass 方法?

最佳答案

好的,我自己解决了这个问题,在这里为后代回答。

在 StdLexical 中,您已经可以在词法分析器中指定空格。您所要做的就是适本地覆盖您的 token 方法。这是一些示例代码(删除了不相关的位)

override def token: CeeLexer.Parser[Token] = controlLine 
  // | ... (where ... is whatever you want to keep of the original method)
def controlLine = hashInclude

def hashInclude : CeeLexer.Parser[HashInclude] =
  ('#' ~ word("include") ~ rep(nonEolws)~'\"' ~ rep(chrExcept('\"', '\n', EofCh)) ~ '\"' ~ '\n' |
   '#' ~ word("include") ~ rep(nonEolws)~'<' ~ rep(chrExcept('>', '\n', EofCh)) ~ '>' ~ '\n' ) ^^ {
   case hash~include~whs~openQ~fname~closeQ~eol =>  // code to handle #include
 }

关于scala - scala StdLexical 中的 Lexing 换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2635887/

相关文章:

scala - SBT 找不到另一个 sbt 文件中添加的解析器

c - 在 C 中的 getline 中识别 EOF 与换行符

Python 替换和剥离无法删除回车符和换行符\r\n

java - antlr4 跨模式共享规则

scala - 列出所有可见的隐式

scala - 测试中的 SBT 清理 Hook

sbt 控制台中的 Scala 2.10 和 Continuations (akka-dataflow)

java - 在 StringBuilder 中包含换行符

java - 基于 ANTLR4 的词法分析器在 NetBeans 上键入期间丢失语法突出显示

ocaml - ocamllex 正则表达式的外部定义