Что не так с этим файлом YACC? - PullRequest
2 голосов
/ 05 января 2011

Я получаю эту ошибку tema4.y: 13.19-26: синтаксическая ошибка, непредвиденный тип в следующем коде, пожалуйста, помогите мне!

%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
%}
%union {
int intval;
char* strval;
char* charval;
}
%token <charval>SHR <intval>NR
%token CMP
%type <strval>str <intval>expr
%nonassoc CMP '|'   
%left '+' '-'
%left '*' '`' '#'

%start s
%%
s:str {printf("%s \n",$<strval>$);}
 | expr {printf("%s \n",$<intval>$)}
 ;
str : str '+' str {
                   char* s=malloc(strlen($1)+strlen($3)+1);
                   strcpy(s,$1);
                   strcat(s,$3);
                   $$=s;
                   }
    | str '-' str {
                   char *s=malloc(strlen($1));
                   char *sir=malloc(strlen($1)-strlen($3));
                   char *pt,*ps;
                   int i;
                   strcpy(s,$1);
                   pt=strstr(s,$3);   
                   if(pt) {
                           ps=pt+strlen($3);
                           strncpy(pt,ps,strlen(ps)); 
                           ps+=strlen(ps);
                           strncpy(sir,s,strlen($1)-strlen($3));
                          }
                  $$=sir;
                  }
    | str '*' NR {
                   int i;
                   char* s=malloc(strlen($1)*NR+1);
                   for(i=0;i<$3;i++)
                   {
                      strcat(s,$1);
                   }
                   $$=s;
                 }
    | str '#' NR {
                   char *s=malloc($3+1);
                   strcpy(s,$1);
                   if($3>strlen($1)) {printf("Nr prea mare\n");exit(1);}
                   else {s=s+strlen(s)-$3;
                        $$=s;}
                 }
    | NR '`' str {
                  char *s=malloc($1+1); 
                  strncpy(s,$3,$1);
                  $$=s;
                 }

    | '(' str ')' {
                  $$=$2;
                  }
    | SHR {
         char* s=malloc(strlen($1));
         strcpy(s,$1);
         $$=s;
         }
    | expr
    ;
expr : str CMP str {
                  if(strcmp($1,$3)) $$=0;
                  else $$=1;
                  }
    | '|' str '|' {
                  $$=strlen($2);
                  }
 ;
%%
int main(){
   yyparse();
}

Ответы [ 2 ]

2 голосов
/ 05 января 2011

Джон имеет ответ на вашу первую ошибку - только один тип в объявлении %type или %token.Для второй ошибки (тип clash) проблема в вашем правиле str: expr ; - str равен <strval>, а expr равен <intval>, поэтому действие по умолчанию ({ $$ = $1; } эффективно) имеет тип clash.*

У вас также есть где-то конфликт уменьшения / уменьшения - вам нужно запустить yacc с -d и посмотреть полученный файл y.output для более подробной информации о том, что это за конфликт.

2 голосов
/ 05 января 2011

Насколько я могу судить, в декларации %token или %type может быть только один <type>.Вы можете иметь несколько токенов или нетерминалов, но только одно имя типа.Попробуйте разбить эти строки:

%token <charval> SHR
%token <intval> NR
%token CMP
%type <strval> str
%type <intval> expr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...