我正在努力编写一个可以捕获各种评论甚至“未完成”评论错误的规则。
这是基于 Pascal 的语言。评论可以是以下形式:
(* ...with any characters within... *)
(*
* separated onto multiple lines
*)
(* they can contain "any" symbol, so -, +, :, ; , etc. should be ignored *)
但我需要捕捉任何评论错误,例如:
(* this comment has no closing r-parenthesis *
或者(* this comment is missing an asterisk )
到目前为止我有这个:
{%
int yylval;
vector<string> string_table;
int string_table_index = 0;
int yyline = 1, yycolumn = 1;
%}
delim [ \t\n]
ws {delim}+
letter [a-zA-Z]
digit [0-9]
id {letter}({letter}|{digit})*
number {digit}+
float {digit}+(\.{digit}+)?(E[+\-]?{digit}+)?
%%
{ws} {yycolumn += yyleng;}
"(*" {
int c;
yycolumn += yyleng;
while ((c = yyinput()) != '*' && c != EOF) {
c = yyinput(); /* read additional text */
if (c == '*') {
while ((c = yyinput()) == '*') {
c = yyinput();
if (c == ')') {
break; /* found the end */
} else if (c == EOF) {
cout << "EOF in comment\n";
break;
} else {
cout << "unended comment, line = "
<< yyline << ", column = "
<< yycolumn-yyleng << "\n";
}
}
}
}
}
它没有抓住最后一个括号(总是打印出来
RPARENtoken
!),它不会忽略注释中的所有字符(即:打印
MINUStoken
“-”)它无法捕获多行的评论。
我不确定它是否正确捕获了未完成的评论错误。
我想我很接近了……谁能看到我哪里出错了?