0
Делает лексер для заявления вроде так, (C++ гибких зубров вкуса): -Regex для относительной FilePath
model @l1 ./something/city1.obj
для. /something/city1
часть, я использую регулярное выражение
"./"([[a-zA-Z0-9]+"/"]*)?([a-zA-Z0-9]+)
И все же я получаю ошибки синтаксиса. Зачем? Мой мыслительный процесс был следующим:
- Во-первых, он проверяет точное совпадение, слэш сбрасывается, не должно быть проблемой.
- Далее он проверяет на наличие
[a-zA-Z0-9]+
i.e. а затем/
. Итак, папки сделаны. - И наконец, он проверяет наличие
[a-zA-Z0-9]+
, который является видом допустимого имени файла.
Вот окружающий код:
lexer.l
%{
#include <stdio.h>
#include <string>
#include "bisoner.tab.h"
using namespace std;
%}
%%
"Tax" return TAXTOKEN;
"rent" return RENTTOKEN;
"cost" return COSTTOKEN;
"route" return RTOKEN;
"Currency" return CURRENCYTOKEN;
"StartingMoney" return STARTINGMONEYTOKEN;
"JailFine" return JAILFINETOKEN;
"location" return LOCATIONWORD;
"@l" return LTOKEN;
"@g" return GTOKEN;
"model" return MODELTOKEN;
"#"[a-zA-Z0-9.-_= ]+ printf("comment ignored\n");
[0-9]+ yylval.number=atoi(yytext);return INTEGER;
[a-zA-Z]+ yylval.str=new string(yytext);return WORD;
"./"([[a-zA-Z0-9]+"/"]*)?([a-zA-Z0-9]+) yylval.str=new string(yytext);return FILEPATHTOKEN;
".obj" return OBJEXTENSION;
"%" return PERCENTSIGN;
%%
bison.y
%{
#include <stdio.h>
#include <string>
#include <map>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include "Monopoly.h"
using namespace std;
extern int yylex();
extern void yyerror(char*);
Monopoly game;
void yyerror(const char *str)
{
fprintf(stderr,"error: %s\n",str);
}
%}
%token LTOKEN INTEGER LOCATIONWORD WORD GTOKEN CURRENCYTOKEN JAILFINETOKEN STARTINGMONEYTOKEN RTOKEN COSTTOKEN RENTTOKEN FILEPATHTOKEN OBJEXTENSION MODELTOKEN TAXTOKEN PERCENTSIGN
%union{
std::string *str;
int number;
}
%token <number> INTEGER
%token <str> WORD
%token <str> FILEPATHTOKEN
%%
commands: /* empty */
| command commands
;
command:
currency_set
|
location_set
|
startingMoney_set
|
jailFine_set
|
route_add
|
cost_set
|
rent_set
|
filepath_found
|
tax_set
;
filepath_found:MODELTOKEN LTOKEN INTEGER FILEPATHTOKEN WORD OBJEXTENSION
{
string x=*($4)+*($5)+".obj";
game.locations.at($3).locationOfObjectFile=x;
printf(" File %s HAS BEEN IMPORTED for location number %d \n",x.c_str(),$3);
}
rent_set:RENTTOKEN LTOKEN INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER
{
printf("rent for house no 4 is %d \n",$7);
}
cost_set:COSTTOKEN LTOKEN INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER
{
printf("prices set to %d\n",$10);
}
currency_set:CURRENCYTOKEN WORD
{
game.currency=*($2);
}
location_set:
LOCATIONWORD LTOKEN INTEGER WORD GTOKEN INTEGER
{
Location newCity;
newCity.locationNo=$3;
newCity.name=*($4);
newCity.group=$6;
game.locations.push_back(newCity);
printf("new city %d named %s in group %d\n",newCity.locationNo,newCity.name.c_str(),newCity.group);
}
startingMoney_set:
STARTINGMONEYTOKEN INTEGER
{
game.startingMoney=$2;
printf("starting money set to %f \n",game.startingMoney);
}
jailFine_set:
JAILFINETOKEN INTEGER
{
game.jailFine=$2;
printf("jailfine set to %f\n",game.jailFine);
}
route_add:
RTOKEN LTOKEN INTEGER LTOKEN INTEGER
{
game.graph[$3][$5]=true;
printf("Route set up between location no %d \n",game.graph[$3][$5]);
}
tax_set:
TAXTOKEN INTEGER PERCENTSIGN INTEGER
{
game.taxPercent=$2;
printf("tax set to %f percent\n",game.taxPercent);
}
%%
int yywrap()
{
return 1;
}
extern FILE * yyin;
int bisonParser()
{
yyin=fopen("csp301_configFile.txt","r");
yyparse();
std::cout<<game.currency.c_str();
string json="{ \"hello\" : \"world\"} ";
rapidjson::Document d;
d.Parse<0>(json.c_str());
printf("%s\n", d["hello"].GetString());
return 1;
}
Как это не работает?
Что вы пытаетесь сделать с кавычками в регулярном выражении? Вы получаете синтаксические ошибки при компиляции или при запуске? – Biffen
Познакомившись с вашим «регулярным выражением», похоже, что вы должны начать с учебника по регулярному выражению. В вашей текущей попытке есть несколько проблем. Что касается кавычек, я предполагаю, что вы либо поняли, что регулярное выражение - это встроенный тип (который не находится на C++ (как, например, Perl)), либо вы считаете, что это способ избежать вещей (которого нет). Было бы хорошо, если бы вы могли показать нам окружающий код. – Biffen
Ошибка синтаксиса во время работы. Вероятно, потому, что он не соответствует целевой строке. –