我想返回 DOLLARID($foo) 和 DOTID(.foo),所以我写了一条规则(我的 lex 文件的代码片段):
ID ([_a-zA-Z]+[a-zA-Z0-9_\-]*)
DOLLAR ("$"|("$!"))
DOT "."
%x DIRECTIVE REFERENCE
%%
[^#$]*?/"$" {BEGIN REFERENCE;yylval.string = yytext;printf("==========begin reference flex content===content:%s=====\n",yytext);return CONTENT;}
[^$#]*?/"#" {BEGIN DIRECTIVE;yylval.string = yytext; return CONTENT;}
<REFERENCE,DIRECTIVE>{DOLLAR}{ID} {yylval.string = yytext;printf("==========flex content===ID:%s=====\n",yytext);return DOLLARID;}
<REFERENCE,DIRECTIVE>{DOT}{ID} {yylval.string = yytext;printf("==========flex content===DOTID:%s=====\n",yytext);return DOTID;}
我的 yacc 文件的代码片段:
set:SET PARENTHESIS reference EQUAL expression CLOSE_PARENTHESIS { $$ = set_directive($3,$5); }
;
reference: DOLLARID {printf("reference ---Id,key:%s\n",$1);$$ = reference($1);}
|DOLLARID DOTID {printf("reference ---dotId\n");$$ = reference($2);}
;
我写了一个测试文件 test.vm
#set($arr = [1..5])
#set($hell = "sinory")
$hell
$arr
当我运行它时,部分结果是:
第 1 行是 lexer 打印的,没错
第 2 行由野牛打印,超过两个字符(" ="
)
因为flex需要的不仅仅是token?</p>
我不知道为什么?请帮我解决它。