【问题标题】:Why the return value for more than a token?为什么返回值不止一个token?
【发布时间】:2013-04-15 04:07:16
【问题描述】:

我想返回 DOLLARID($foo) 和 DOTID(.foo),所以我写了一条规则(我的 lex 文件的代码 sn-p):

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 文件的代码 sn-p:

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行是bison打印的,多于两个字符(" =")

因为flex需要的不仅仅是一个token?

我不知道为什么?请帮我解决它。

【问题讨论】:

    标签: bison yacc lex flex-lexer


    【解决方案1】:

    问题在于yytext 仅对单个令牌有效,并且将被下一次读取的令牌覆盖或以其他方式修改。所以返回一个指向它的指针通常是行不通的——它会有一段时间的标记文本,但稍后会从你下面改变。如果您想在解析器中实际使用它的值,您需要复制yytext 中的字符串。

    将您的词法分析器代码更改为使用yylval.string = strdup(yytext);,这样会更好地工作(不过您需要担心释放字符串以避免内存泄漏)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2016-05-07
      • 2014-04-21
      • 2022-12-03
      • 2017-03-25
      • 2014-03-20
      • 1970-01-01
      相关资源
      最近更新 更多