Что не так с этим файлом yacc?

Я получаю эту ошибку 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();
}

person andrei    schedule 05.01.2011    source источник
comment
Эта строка %type str expr. Очевидно, что с этим что-то не так. Как насчет того, чтобы заглянуть в документацию yacc и выяснить, как следует использовать %type?   -  person    schedule 05.01.2011
comment
Я использую gcc, я не мог t write '<' brace here, but when I compile, all the braces are where they're supposed to be, the error is to the start symbol and I don понять, почему.   -  person andrei    schedule 05.01.2011
comment
Чтобы включить код, вставьте его, выберите его и нажмите Ctrl-K, чтобы сделать отступ каждой строки в четыре пробела. Это работает как <pre><code>, но сохраняет угловые скобки < и >.   -  person John Kugelman    schedule 05.01.2011


Ответы (2)


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

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

person Chris Dodd    schedule 05.01.2011

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

%token <charval> SHR
%token <intval> NR
%token CMP
%type <strval> str
%type <intval> expr
person John Kugelman    schedule 05.01.2011
comment
Я уже пробовал это, но когда я это сделал, появилась следующая ошибка: **tema4_y.y:78.7-10: предупреждение: конфликт типов при действии по умолчанию: ‹strval› != ‹intval› конфликты: 1 уменьшить/уменьшить - person andrei; 05.01.2011