0

我正在使用 Lex 和 Yacc 来设计解析器并遇到一些关于注释的问题。

我使用以下 Lex 规则。

'#'[^('\r'|'\n')]*    { /* do nothing */ }

它可以工作,但在执行结束时,所有注释都会打印到标准输出。有办法清除吗?感谢您的建议。

4

1 回答 1

1

字符', |, (, 和)中没有特殊含义[],因此您只匹配(并丢弃)不包含它们的注释。此外,在大多数版本的 lex'中根本没有特殊含义——只能"用于引用文字字符串。你可能想要的是:

"#"[^\r\n]*     { /* do nothing */ }

另外,#也没有什么特殊含义,所以也没有必要引用它。

一般来说,如果你使用 lex(或 flex)作为解析器的输入,你永远不需要默认的回显行为,所以最好在最后添加一个“catch-all”规则:

.|\n            { fprintf(stderr, "Unexpected character '%c' in input\n", *yytext); }
于 2012-09-11T22:43:21.407 回答