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 -}

  -}

-}