Как я могу сделать функцию yyparse читать ее входные данные из строки C?Использование Bison для синтаксического анализа из строки char *
Пробовал yy_scan_buffer (используя "FP" префикс вместо "уу"):
extern YY_BUFFER_STATE fs_scan_string (const char *str);
struct fs *parse(char *s)
{
fp_scan_buffer(s);
int r = fpparse();
return r == 0 ? AST : NULL;
}
Но:
h1.cpp:27: error: ‘YY_BUFFER_STATE’ does not name a type
h1.cpp: In function ‘fs* parse(char*)’:
h1.cpp:32: error: ‘fp_scan_buffer’ was not declared in this scope
Пробовал с помощью yy_delete_buffer, тот же результат: не был объявлен в этот объем.
fp.y
%{
#include "ft.h"
#include <map>
#include <iostream>
int fplex();
int fperror(char *p);
int fperror(char *p) { }
using namespace std;
struct fs *AST;
bool fpworking = true;
%}
%union {
struct fs *f;
struct ts *t;
std::list<struct ts *> *tl;
std::string *s;
}
%token END_OF_FILE
MORE TOKEN HERE...
%%
s : formula '\n' { AST = $1; fpworking = true; YYACCEPT; }
MORE RULE HERE...
fp.l
%{
#include <iostream>
#include <list>
using namespace std;
#include "fp.tab.h"
%}
%option noyywrap
%%
[a-z][a-zA-Z0-9]* { fplval.s = new std::string(fptext); return (TERM_ID); }
MORE PATTERN HERE...
h1.cpp
#include <iostream>
#include <list>
#include <string>
#include <map>
#include <stdlib.h>
#include <fstream>
#include "ft.h"
int fpparse();
int signparse();
extern bool fpworking;
extern struct fs *AST;
int main(int argc, char **argv)
{
MORE CODE HERE...
}
Знайте правильную маркировку. Flex используется для интерфейса Adobe/Apache. Flex-lexer используется для лексического анализатора. – JeffryHouser
Проблема заключается в взаимодействии кода, который вы показали, и кода, который вы не показывали. Пожалуйста, создайте полный, автономный, вырезанный файл .y, который демонстрирует ту же проблему. – zwol