2009-07-05 5 views
4

저는 LaTeX를 MathML로 변환하는 Bison/Flex 프로그램을 작성하고 있습니다. 순간, 함수를 처리 (예 : \ SQRT, \의 FRAC 등) 모든 기능Flex가 문자열 일치를 들소로 반환 할 수 있습니까

\\frac   {return FUNC_FRAC;} 

의 토큰으로, 다음과 같이 작동 및 설명에 그 역할을 다시 들소에 토큰 FUNC_FRAC을 전달합니다

그러나 이는 잠재적으로 무제한의 토큰을 정의하고 저글링해야 함을 의미합니다. 제가하고 싶은 것은 이와 같이 쓰여진 것처럼 작동하지 않습니다.

\\[A-Za-z]+[0-9]* {return the-matched-string;} 

와 들소 : 플렉스에서

function: "\frac" LBRACE atom RBRACE LBRACE atom RBRACE {$$ = "<mfrac>" + $3 + $6 + "</mfrac>";} 

답변

6

플렉스는 들소의 추상적 인 토큰 값을 반환해야합니다.

당신은 값 플렉스의 어휘 (일치하는 문자열을) 찾을 수 있습니다

yytext 

을 그리고 당신이 할 수 있습니다

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

등. yylval 구조체는 .. 당신이 토큰 형지나 평가하기 위해 사용하는 어떤 들소 조합 /에 IIRC에 관한 그래서 나는 들소의 자동 기계를 파괴하는 토큰 형 이외의 반환 들소

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

에있을 수 있습니다 . 귀하의 Bison 조치는 다음과 같이 접근 할 수 있습니다 :

id_production: TOK_ID 
    { 
     $<node_val>$ = create_id_node(yylval.strval); 
     xfree(yylval.strval); // func makes a copy, so we are cool. 
    } 

등등. 이것보다 더 많은 설명과 나는 아마 문서를 반복 시작합니다. 상황이 상담 : (항상)

  1. 용 도서 (시작하기에 좋은) C에서
  2. 현대 컴파일러 구현
  3. Bison docs
  4. Flex docs

행운

+0

오, 소년. yytext 물건. 기억 나 대학 –

+2

내가 질문을 보지 않았 으면 좋겠어 ... 내가 오래된 프로젝트를 끝내고 싶어하게) –

+0

Lex와 Yacc 책은 함수에 대한 지원을 추가하고 손 코드를 피하는 방법을 보여주는 간단한 계산기 예제를 가지고있다. 각 함수를 호출하고 위의 TOK_ID 스타일을 사용하여 yacc/bison에 테이블을 작성하고 create_id_node에서 많은 작업을 수행합니다 –

관련 문제