2016-08-05 157 views
1

我试图在Racket中编写一个忽略行注释的词法分析器(即,从开头#开始,直到行结束)。该行的末尾,在我的脑海里,可能是因为存在#\newline(eof),但显然以下为(eof)不起作用在这个位置上是无效的:如何使用parser-tools/lex-sre匹配换行符或文件结尾

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

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

是否有可能因为我将它们结合起来试图超越,或者我必须为每个人分别制定规则?

在我看来,无论你什么时候练习潜在的多行字符串,你都会遇到这个问题。这是否是错误的方法; (eof)是否应该从最顶级的词法分析器中完成?

回答

1

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

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

这意味着union希望所有的子窗体是正则表达式,并自 (eof)re上市,它不是一个正则表达式。实际上(eof)被列为trigger

因此(union #\newline (eof))不是一个正则表达式(注意这里:orunion的简称)。

结论是,您需要将规则“行注释以#开始,并且以newline或结尾为eof”来代替语法。一种方法是制定一个词法分析规则,将“#后跟任何不是换行符或eof”变为行注释标记。然后在解析器的语法中,需要一个行注释,然后换行符或eof。

相关问题