Compilation Flex:添加新规则时出现语法错误
我当前的lex文件如下所示: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"
%{
#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"); }
;