Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bison 无法识别Flex lexer启动条件_Bison_Flex Lexer_Lexer - Fatal编程技术网

Bison 无法识别Flex lexer启动条件

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

我有一台扫描仪,它保持两种独占状态(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 text;”的解析失败。

当在状态
WORD
中遇到
时,状态肯定会改变为
DEFN
。但是,下次调用
yylex
时(为了获取管道后面的令牌),块会将状态重置为
WORD

%{
    BEGIN(WORD);
%}
从(增加强调)开始:

在规则部分中,出现在第一条规则之前的任何缩进或%{%}封闭文本可用于声明扫描例程本地的变量,以及(声明之后)每次进入扫描例程时执行的代码


您最好使用
初始
开始条件来表示初始开始条件。

您不需要在该语法中使用开始状态。这正是问题所在-谢谢!有没有办法将初始状态设置为其他“初始”状态?安德鲁斯:据我所知没有,这就是为什么使用初始状态作为初始状态是有意义的。
首字母
没有什么特别之处,所以没有理由不这样使用它。@AndrewS:实际上有一种方法,但它很难看。您添加了一条与
|\n
匹配的
规则,其操作是更改开始条件,然后使用
yyless(1)
将匹配的字符放回流中。但是为什么要麻烦呢?只需使用
INITIAL
作为初始启动条件。除此之外,这样做会使你的桌子变小。是的,我得出了同样的结论。已将规则中的所有内容移至初始规则,现在一切正常-感谢您的帮助。您也可以使用
BEGIN(WORD)%%
之后)。
%{
    BEGIN(WORD);
%}