0

我正在努力编写一个可以捕获各种评论甚至“未完成”评论错误的规则。

这是基于 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";
                }
            }
        }
    }
 }
  1. 它没有抓住最后一个括号(总是打印出来RPARENtoken!),

  2. 它不会忽略注释中的所有字符(即:打印MINUStoken“-”)

  3. 它无法捕获多行的评论。

  4. 我不确定它是否正确捕获了未完成的评论错误。

    我想我很接近了……谁能看到我哪里出错了?

4

1 回答 1

4

考虑使用开始条件来避免在(*模式中编写所有额外的代码。我在下面写了一个简短的例子。

%x COMMENT
%%
"(*" { BEGIN(COMMENT); }
<COMMENT>{
    "*)" { BEGIN(INITIAL); }
    <<EOF>> { printf("EOF in comment\n"); }
    . {}
}

基本上,当词法分析器找到注释的开头时,它就会进入COMMENT状态,并且只会检查<COMMENT>块内的规则。当它找到时*),它会回到初始状态。请注意,如果您打算使用多个状态,最好使用yy_push_state(COMMENT)andyy_pop_state(COMMENT)而不是BEGIN(STATENAME).

我不完全确定您的评论错误标准是什么(例如,它与在评论中遇到 EOF 有何不同),但这可能也可以扩展到处理这些情况。

于 2013-02-07T01:14:40.693 回答