Compilation Flex:添加新规则时出现语法错误

Compilation Flex:添加新规则时出现语法错误,compilation,bison,flex-lexer,Compilation,Bison,Flex Lexer,我当前的lex文件如下所示: %{ #include "foo.h" void rem_as(char* string); %} DIGIT [0-9] LITTERAL [a-zA-Z] SEP [_-]|["."]|["\\"][ ] FILE_NAME ({DIGIT}|{LITTERAL}|{SEP})* PATH ({FILE_NAME}"/"{FILE_NAME})*|({FILE_NAME}) %% "move"

我当前的lex文件如下所示:

%{
#include "foo.h"
void rem_as(char* string);
%}

DIGIT        [0-9]
LITTERAL     [a-zA-Z]
SEP          [_-]|["."]|["\\"][ ]
FILE_NAME    ({DIGIT}|{LITTERAL}|{SEP})*
PATH         ({FILE_NAME}"/"{FILE_NAME})*|({FILE_NAME})

%%

"move"       {return MOVE;}
"mv"         {return MOVE;}
">"          {return R_STDOUT;}
"2>"         {return R_STDERR;}
"<"          {return R_STDIN;}
"|"          {return PIPE;}
"&"          {return AND;}
"="          {return EQUAL_SIGN;}
"-"?{DIGIT}+ {yylval.integer = atoi(yytext); return NUM;}
{PATH}       {rem_as(yytext); sscanf(yytext,"%[^\n]",yylval.string); return FILENAME;}
\n           {return LINEBREAK;}
. ;

%%
我可以做像移动a b这样的事情


现在我的问题是:

在把这个添加到我的lex文件之后

VAR_NAME     [a-zA-Z][a-zA-Z0-9_-]*

...

{VAR_NAME}   {return VAR_NAME;} // declared before the "=" rule
我以前的规则被打破了,尤其是文件名,它现在必须包含一个“/”

例如,使用此语法:

VarDecl: VAR_NAME EQUAL_SIGN FILENAME { puts("foo"); }
       ;
a=b/
工作,而
a=b
抛出语法错误

知道问题的原因吗?

谢谢。

声明lex规则的顺序很重要,b与VAR_NAME匹配,因此在尝试匹配PATH之前,会发出VAR_NAME标记,因此您最终会得到一个无效的VAR_NAME等号VAR_NAME规则

简单的解决办法是在语法中设置路径规则,而不是在词汇中

路径:VAR_NAME | FILE_NAME | VAR_NAME斜杠路径| FILE_NAME斜杠路径


在lex文件中添加/作为令牌。

我选择的解决方案是为
var=
使用一个令牌,这样就不会产生歧义,也不会更改我的所有代码。你的回答让我明白了这个问题,所以谢谢你。
VarDecl: VAR_NAME EQUAL_SIGN FILENAME { puts("foo"); }
       ;