我正在使用 Lex 和 Yacc 来设计解析器并遇到一些关于注释的问题。
我使用以下 Lex 规则。
'#'[^('\r'|'\n')]* { /* do nothing */ }
它可以工作,但在执行结束时,所有注释都会打印到标准输出。有办法清除吗?感谢您的建议。
字符'
, |
, (
, 和)
中没有特殊含义[]
,因此您只匹配(并丢弃)不包含它们的注释。此外,在大多数版本的 lex'
中根本没有特殊含义——只能"
用于引用文字字符串。你可能想要的是:
"#"[^\r\n]* { /* do nothing */ }
另外,#
也没有什么特殊含义,所以也没有必要引用它。
一般来说,如果你使用 lex(或 flex)作为解析器的输入,你永远不需要默认的回显行为,所以最好在最后添加一个“catch-all”规则:
.|\n { fprintf(stderr, "Unexpected character '%c' in input\n", *yytext); }