2009-07-05 118 views
4

我正在寫一個Bison/Flex程序將LaTeX轉換成MathML。目前,處理功能(即\的sqrt,\壓裂等)是這樣工作的,與令牌爲每個函數可以Flex返回一個字符串匹配到野牛

\\frac   {return FUNC_FRAC;} 

,並傳遞令牌FUNC_FRAC回野牛,發揮其部分的說明的子樹:

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>";} 

回答

6

的Flex應該返回抽象令牌值野牛。

您可以在Flex的詞位(匹配的字符串)的值:

yytext 

所以你可以這樣做:

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

等等。該yylval結構涉及到IIRC野牛聯盟/不管你使用的評估過去令牌型..所以我有可能在野牛

%union { 
    char *strval; 
    int intval; 
    node node_val; 
} 

返回比令牌型以外的任何事情都會打破野牛自動機。你的野牛動作可以訪問諸如:

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. Bison docs
  4. Flex docs

好運

+0

哦,男孩。 yytext的東西。記住我的大學 – 2009-07-05 21:05:55