Racket 如何使用解析器工具/lex sre匹配换行符或文件结尾
我正在尝试在Racket中编写一个忽略行注释的lexer(即,从开头开始,一直到行尾)。在我看来,行的结尾可以是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)
\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