6

我正在编写一个 Bison/Flex 程序来将 LaTeX 转换为 MathML。目前,处理函数(即 \sqrt、\frac 等)的工作方式是这样的,每个函数都有一个标记

\\frac         {return FUNC_FRAC;}

并将令牌 FUNC_FRAC 传递回 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>";}
4

1 回答 1

7

Flex 应该将抽象令牌值返回给 Bison。

您可以在值中找到 Flex 中的词位(匹配的字符串):

yytext

所以你可以这样做:

{id}    { yylval->strval=strdup(yytext); return(TOK_ID); }

等等。该yylval结构将 IIRC 与野牛联合/您用来评估令牌类型的任何内容相关联..所以我可能在 Bison

%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.
    }

等等。比这更多的解释,我可能会开始重复文档。咨询事项:

  1. 龙书(一如既往)
  2. C 中的现代编译器实现(非常适合入门)
  3. 野牛文档
  4. 弹性文档

祝你好运

于 2009-07-05T21:02:23.107 回答