может ли Flex вернуть соответствие строки bison

StackOverflow https://stackoverflow.com/questions/1084812

  •  23-08-2019
  •  | 
  •  

Вопрос

Я пишу программу 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>";}
Это было полезно?

Решение

Flex должен возвращать абстрактное значение токена Bison.

Вы можете найти лексему (соответствующую строку) в Flex в значении:

yytext

И поэтому вы можете сделать:

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

И так далее.В yylval struct связывает IIRC с объединением bison / всем, что вы используете для оценки за пределами token-type ..так что я мог бы иметь в Бизоне

%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. Гибкие документы

Удачи

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top