Flex 可以将字符串匹配返回给 bison
-
23-08-2019 - |
题
我正在编写一个 Bison/Flex 程序来将 LaTeX 转换为 MathML。目前,处理函数(即\sqrt、\frac 等)的工作原理如下,每个函数都有一个标记
\\frac {return FUNC_FRAC;}
并将令牌 FUNC_FRAC 传递回 bison,bison 在此子树的描述中发挥作用:
function: FUNC_FRAC LBRACE atom RBRACE LBRACE atom RBRACE {$$ = "<mfrac>" + $3 + $6 + "</mfrac>";}
但这意味着我需要定义和处理可能无限数量的令牌。我想做的是这样的事情,但它并不像写的那样工作。在柔性中:
\\[A-Za-z]+[0-9]* {return the-matched-string;}
在野牛中:
function: "\frac" LBRACE atom RBRACE LBRACE atom RBRACE {$$ = "<mfrac>" + $3 + $6 + "</mfrac>";}
解决方案
Flex 应将抽象代币值返回给 Bison。
您可以在 Flex 中的值中找到词位(匹配的字符串):
yytext
所以你可以这样做:
{id} { yylval->strval=strdup(yytext); return(TOK_ID); }
等等。这 yylval
struct 将 IIRC 与 bison union/无论您使用什么来评估过去的令牌类型相关联。所以我可能会在野牛
%union {
char *strval;
int intval;
node node_val;
}
返回令牌类型以外的任何内容都会破坏 Bison 中的自动机。您的 Bison 操作可以访问,例如:
id_production: TOK_ID
{
$<node_val>$ = create_id_node(yylval.strval);
xfree(yylval.strval); // func makes a copy, so we are cool.
}
等等。如果有比这更多的解释,我可能会开始重复文档。咨询事项:
祝你好运
不隶属于 StackOverflow