Racket 如何使用解析器工具/lex sre匹配换行符或文件结尾

Racket 如何使用解析器工具/lex sre匹配换行符或文件结尾,racket,lexer,Racket,Lexer,我正在尝试在Racket中编写一个忽略行注释的lexer(即,从开头开始,一直到行尾)。在我看来,行的结尾可以是\newline或(eof),但以下内容显然不起作用,因为(eof)在该位置无效: (define comment-lexer (lexer [(:or #\newline (eof)) (cons `(COMMENT) (main-lexer input-port))] [any-char (comment-lexer input-port)

我正在尝试在Racket中编写一个忽略行注释的lexer(即,从开头开始,一直到行尾)。在我看来,行的结尾可以是
\newline
(eof)
,但以下内容显然不起作用,因为
(eof)
在该位置无效:

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

    [any-char
     (comment-lexer input-port)]))
有没有可能像我在上面尝试的那样将它们结合起来,或者我必须为每一个单独编写规则


在我看来,每当你对一个潜在的多行字符串进行词法分析时,你都会遇到这个问题。因此,这是错误的做法吗;
(eof)
处理是否应该从最顶层的lexer中完成?

lexer理解的正则表达式语法包含以下规则:

`re ::= ... | (union re ...) `
这意味着
union
希望所有子表单都是正则表达式,并且
(eof)
未列在
re
中,它不是正则表达式。事实上,
(eof)
被列为一个
触发器

因此,
(union#\newline(eof))
不是正则表达式(注意这里的
:或
union
的缩写)

结论是,您需要将规则“行注释以#开头,以
换行
eof
结尾”移到语法中。一种方法是制定一个lexer规则,将“#后跟任何非换行符或eof”转换为行注释标记。然后在解析器的语法中,要求行注释后跟换行符或eof