带有开始条件的注释(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
不会被该规则匹配,因此它会被您通常用来识别它的任何规则正确处理。然后它将传递给语法,而无需您做任何额外的工作。
我正在用 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
不会被该规则匹配,因此它会被您通常用来识别它的任何规则正确处理。然后它将传递给语法,而无需您做任何额外的工作。