Parsing Lex/Flex中的启动状态

Parsing Lex/Flex中的启动状态,parsing,bison,lex,lexical-analysis,flex-lexer,Parsing,Bison,Lex,Lexical Analysis,Flex Lexer,我使用Flex和Bison作为解析器生成器,但在扫描仪中的启动状态有问题 我使用排他性规则来处理评论,但这种语法似乎与引用的标记不匹配: %x COMMENT // { BEGIN(COMMENT); } <COMMENT>[^\n] ; <COMMENT>\n { BEGIN(INITIAL); } "==" { return EQUALEQUAL; } .

我使用Flex和Bison作为解析器生成器,但在扫描仪中的启动状态有问题

我使用排他性规则来处理评论,但这种语法似乎与引用的标记不匹配:

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;
不完全匹配作为注释,除非我包含以下规则:

<COMMENT>"=="             ;
“==”;

我如何在不必将所有这些令牌添加到我的专用规则中的情况下解决这个问题?

匹配Lex/Flex中的C风格注释或任何有详细记录的内容:

,以及互联网上的各种变体

以下是Flex文档中的一个变体:

   <INITIAL>{
     "//"              BEGIN(IN_COMMENT);
     }
     <IN_COMMENT>{
     \n      BEGIN(INITIAL);
     [^\n]+    // eat comment
     "/"       // eat the lone /
     }
{
“//”开始(在注释中);
}
{
\n开始(初始);
[^\n]+//eat注释
“/”//吃孤独的人/
}
尝试在[^n]规则后添加“+”。我不知道为什么排他性状态即使在排他性状态下仍会拾取“==”,但显然是这样。Flex通常会匹配匹配最多文本的规则,添加“+”至少会使这两个规则的长度保持一致。将注释规则放在第一位将导致在平局时使用注释规则。

线索是:

问题是这个“吃评论” 规则似乎与令牌不匹配 不止一个字符

因此,添加*以匹配零行或多行非换行符。您需要零,否则空注释将不匹配

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]*        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;
%x注释
//{开始(评论);}
[^\n]*;
\n{开始(首字母);}
“=”{return EQUALEQUAL;}
.                     ;

如果可以避免的话,我宁愿不使用包含状态,因为我有很多规则。问题是这个“eat comment”规则似乎不匹配具有多个字符(例如==)的标记。那么我认为您可能做错了什么。您需要为注释创建一个与普通标记不匹配的“子解析器”。例如,您想存储每个输入的行,那么这会给您错误的行号吗?@DonCode iirc yylineno给出正确的行,而不考虑开始“块”你可以将其传递给Bison或其他任何人,空注释也不会触发与该规则的匹配,也不需要。真的,真的,下面的那行捕捉到了它。因此,您可以安全地将*更改为a+
%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]*        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;