如何使用parser-tools / lex-sre

时间:2016-08-05 10:18:40

标签: racket lexer

我试图在Racket中写一个忽略行注释的词法分析器(即从一个开头#开始并直到该行的结尾)。在我看来,该行的结尾可以是#\newline(eof),但以下显然不起作用,因为(eof)在此职位中无效:

(define comment-lexer
  (lexer
    [(:or #\newline (eof))
     (cons `(COMMENT) (main-lexer input-port))]

    [any-char
     (comment-lexer input-port)]))

是否可以将它们组合起来,因为我试图在上面,或者我是否必须为每个人编写单独的规则?

在我看来,无论何时你想要一个潜在的多行字符串,你都会遇到这个问题。这是错误的做法; (eof)处理是否应该从最顶层的词法分析器中完成?

1 个答案:

答案 0 :(得分:1)

词法分析器理解的正则表达式的语法包含以下规则:

`re ::= ... | (union re ...) `

这意味着union期望所有子表单都是正则表达式,从那时起 (eof)未列出re,它不是正则表达式。事实上,(eof)被列为trigger

因此(union #\newline (eof))不是正则表达式(请注意,此处:orunion的缩写)。

结论是您需要移动规则"行注释以#开头,并以newlineeof"结尾。而不是语法。一种方法是制作一个词法分析器规则,然后转换为"#后跟任何不是换行符或eof"到一个行注释标记。然后在解析器的语法中,要求换行符后面跟换行符或换行符。