带有开始条件的注释(flex)

Comments with start conditions (flex)

我正在用 flex 和 bison 做一个编译器,我必须允许使用 // 进行注释。 我正在使用 flex 的启动条件,但它不起作用。

代码:

%x comentario2

%%

"//"    {BEGIN(comentario2);}

<comentario2>[^\n]

<comentario2>\n {BEGIN(INITIAL);}

问题是在我的 bison 代码中,我将此语法用于一行:

expr NX_LINE

在我的 flex 代码中,我没有在行尾返回令牌。正确的弹性代码是:

"//"    {BEGIN(comentario2);}

<comentario2>[^\n]

<comentario2>\n {++num_linea;printf("\n");BEGIN(INITIAL);return NX_LINE;}

在 flex 中,.[^\n](除换行符外的任何字符)完全相同。

另外,你的启动条件毫无意义。它只是在做相当于 Kleene 星号(* 正则表达式运算符)的操作,因此您根本不需要它。只需使用规则:

`//.*`

(无操作)。

终止注释的 \n 不会被该规则匹配,因此它会被您通常用来识别它的任何规则正确处理。然后它将传递给语法,而无需您做任何额外的工作。