может ли Flex вернуть соответствие строки bison
-
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.
}
И так далее.Еще одно объяснение, кроме этого, и я, вероятно, начну повторять документацию.С чем нужно проконсультироваться:
- Книга Дракона (как всегда)
- Современная реализация компилятора на C (отлично подходит для начала работы)
- Документы Бизона
- Гибкие документы
Удачи