Bison 无法识别Flex lexer启动条件
我有一台扫描仪,它保持两种独占状态(WORD和DEFN)Bison 无法识别Flex lexer启动条件,bison,flex-lexer,lexer,Bison,Flex Lexer,Lexer,我有一台扫描仪,它保持两种独占状态(WORD和DEFN) %选项noyywrap %s字 %s DEFN %% %{ 开始(单词); %} { “|”{BEGIN(DEFN);返回WS_PIPE;} } { [^;]+{printf(“ds:%s\n”,yytext);返回WD_STRING;} “;”{返回WD_分号;} } \n |。{printf(“U:%s\n”,yytext);} %% 但是,通过简单的输入“| some text;”,当解析管道时,状态没有改变,因此对“some t
%选项noyywrap
%s字
%s DEFN
%%
%{
开始(单词);
%}
{
“|”{BEGIN(DEFN);返回WS_PIPE;}
}
{
[^;]+{printf(“ds:%s\n”,yytext);返回WD_STRING;}
“;”{返回WD_分号;}
}
\n |。{printf(“U:%s\n”,yytext);}
%%
但是,通过简单的输入“| some text;”,当解析管道时,状态没有改变,因此对“some text;”的解析失败。当在状态
WORD
中遇到
时,状态肯定会改变为DEFN
。但是,下次调用yylex
时(为了获取管道后面的令牌),块会将状态重置为WORD
%{
BEGIN(WORD);
%}
从(增加强调)开始:
在规则部分中,出现在第一条规则之前的任何缩进或%{%}封闭文本可用于声明扫描例程本地的变量,以及(声明之后)每次进入扫描例程时执行的代码
您最好使用
初始
开始条件来表示初始开始条件。您不需要在该语法中使用开始状态。这正是问题所在-谢谢!有没有办法将初始状态设置为其他“初始”状态?安德鲁斯:据我所知没有,这就是为什么使用初始状态作为初始状态是有意义的。首字母
没有什么特别之处,所以没有理由不这样使用它。@AndrewS:实际上有一种方法,但它很难看。您添加了一条与|\n
匹配的
规则,其操作是更改开始条件,然后使用yyless(1)
将匹配的字符放回流中。但是为什么要麻烦呢?只需使用INITIAL
作为初始启动条件。除此之外,这样做会使你的桌子变小。是的,我得出了同样的结论。已将规则中的所有内容移至初始规则,现在一切正常-感谢您的帮助。您也可以使用BEGIN(WORD)在调用yyparse或yylex之前调用的.l文件第三部分中定义的函数中(在您拥有的最后一个%%
之后)。
%{
BEGIN(WORD);
%}