Parsing Flex:词法分析器,用于删除Haskell中的多元素行
我有以下代码:Parsing Flex:词法分析器,用于删除Haskell中的多元素行,parsing,haskell,comments,flex-lexer,Parsing,Haskell,Comments,Flex Lexer,我有以下代码: %{ #include<stdio.h> %} %x multicomment %option noyywrap %% --(.*) ; "{-" BEGIN(multicomment); <multicomment>[^*\n]+ <multicomment>"*" <multicomment>\n <mult
%{
#include<stdio.h>
%}
%x multicomment
%option noyywrap
%%
--(.*) ;
"{-" BEGIN(multicomment);
<multicomment>[^*\n]+
<multicomment>"*"
<multicomment>\n
<multicomment>"-}" BEGIN(INITIAL);
%%
int main(int argc,char **argv)
{
yyin=fopen("Code.txt","r");
yyout=fopen("out.c","w");
yylex();
return 0;
}
如果上述代码设置如下:
"/*" BEGIN(multicomment);
<multicomment>[^*\n]+
<multicomment>"*"
<multicomment>\n
<multicomment>"*/" BEGIN(INITIAL);
相反,如果我使用原始代码
"{-" BEGIN(multicomment);
<multicomment>[^*\n]+
<multicomment>"*"
<multicomment>\n
<multicomment>"-}" BEGIN(INITIAL);
“{-”开始(多分量);
[^*\n]+
"*"
\n
“-}”开始(首字母);
使用“{-”&“-}”,它不工作,输出为:
一些文本
它删除了“{-”中的所有字符,直到文件结束,我还尝试了其他论坛推荐的其他设置,如:
<multicomment>"-\}" BEGIN(INITIAL);
<multicomment>"-"+"}" BEGIN(INITIAL);
<multicomment>"-" + "}" BEGIN(INITIAL);
<multicomment>[-}] BEGIN(INITIAL);
“-\}”开始(首字母);
“-”+“}”开始(首字母);
“-”+“}”开始(首字母);
[-}]开始(首字母);
但在这些情况下,当我尝试使用flex CommentClean.l编译时,结果如下:
CommentClean.l:16:警告,无法匹配规则
有人能帮我吗?我错在哪里?怎么办?您只更改了开头和结尾分隔符,但没有更改与内容匹配的规则 最初的规则是“在
多分量
状态下,忽略一个或多个非星号和换行符;忽略单个星号;忽略换行符”。星号后跟斜杠作为结束分隔符与最长匹配规则匹配
<multicomment>[^*\n]+
<multicomment>"*"
<multicomment>\n
但是,请注意,这并不能说明在Haskell中,与C中不同的是,多行注释可能是这样嵌套的:
因此,为了严格正确,还应该包含一个递归匹配多行注释的规则。还要记住,-->
如果不是运算符的一部分,那么它只是一个单行注释,因此例如-->
和|--
是有效的运算符,而不是注释的开头。(是的,人们在真实的代码中使用这些!)
您可以在中找到注释的规范。它说一个符号是:
- 这些字符中的任意一个(ascSymbol):
代码>
#
$
%
&
⋆
+
?
-
;或:
- 除
(
)
,
外,任何带有属性符号(S)或标点符号(p)(uniSymbol)的Unicode字符
[
]
{
(特殊)和}
“
”
<multicomment>"-\}" BEGIN(INITIAL);
<multicomment>"-"+"}" BEGIN(INITIAL);
<multicomment>"-" + "}" BEGIN(INITIAL);
<multicomment>[-}] BEGIN(INITIAL);
<multicomment>[^*\n]+
<multicomment>"*"
<multicomment>\n
<multicomment>[^-\n]+
<multicomment>"-"
<multicomment>\n
{-
a multi-line comment
{-
containing another comment
{- containing yet another comment -}
-}
-}