2014-11-15 4 views
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; 
} 

Как это не работает?

+1

Что вы пытаетесь сделать с кавычками в регулярном выражении? Вы получаете синтаксические ошибки при компиляции или при запуске? – Biffen

+0

Познакомившись с вашим «регулярным выражением», похоже, что вы должны начать с учебника по регулярному выражению. В вашей текущей попытке есть несколько проблем. Что касается кавычек, я предполагаю, что вы либо поняли, что регулярное выражение - это встроенный тип (который не находится на C++ (как, например, Perl)), либо вы считаете, что это способ избежать вещей (которого нет). Было бы хорошо, если бы вы могли показать нам окружающий код. – Biffen

+0

Ошибка синтаксиса во время работы. Вероятно, потому, что он не соответствует целевой строке. –

ответ

0

По какой-то причине это работает для относительных путей к файлам.

"./"([[a-zA-Z0-9]+"/"]*)?    return FILEPATHTOKEN; 
Смежные вопросы