[yacc] Подскажите как правильно сделать

Тема в разделе "WASM.UNIX", создана пользователем nbyte, 5 окт 2010.

  1. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Здравствуйте.
    Сделал вот такой тестовый пример проявляющий суть
    Например есть вот такой фрагмент языка (всё есть в прикреплённом файле включая makefile)
    Код (Text):
    1. DSN=DeluxeCD;DBQ=D:\DOCUME~1\Administrator\APPLIC~1\MICROS~1\CDPLAY~1\DeluxeCD.mdb;DefaultDir=D:\DOCUME~1\Administrator\APPLIC~1\MICROS~1\CDPLAY~1;
    2. SELECT Titles.TitleID, Titles.Artist, Titles.Title, Titles.Copyright, Titles.Label, Titles.ReleaseDate, Titles.NumTracks, Titles.NumMenus
    Код сканера
    Код (Text):
    1. %{
    2.     #include "y.tab.h"
    3. %}
    4.  
    5. %%
    6. [\n]+                            { yylineno++; return NEWLINE;}
    7. [0-9]+                            return NUMBER;
    8. [a-zA-Z0-9:\\~]+                return PARAM;
    9. =                                return EQUAL;    
    10. ;                                return COMCOLM;
    11. ,                                return COMMA;
    12. \.                                return DELIM;
    13. `                                return UPCOMMA;
    14. "SELECT"|"FROM"|"ORDER BY"        return DML;
    15. [\t ]                            return TABORSPACE;
    16. %%
    17.  
    18. int yywrap(void) {
    19.     return 1;
    20. }
    Код анализатора
    Код (Text):
    1. %{
    2. #include <stdio.h>
    3. int yylex(void);
    4. extern int yylineno;
    5. extern FILE *yyin;
    6. extern char* yytext;
    7. void yyerror(char *);
    8. %}
    9.  
    10. %token NEWLINE
    11. %token NUMBER
    12. %token PARAM
    13. %token EQUAL
    14. %token COMCOLM
    15. %token COMMA
    16. %token DELIM
    17. %token UPCOMMA
    18. %token DML
    19. %token TABORSPACE
    20.  
    21. %%
    22. start:
    23.     params lines query
    24.     ;
    25.    
    26. lines:
    27.     NEWLINE |
    28.     lines NEWLINE
    29.     ;
    30.    
    31. params:
    32.     param COMCOLM |
    33.     param COMCOLM params
    34.     ;
    35.    
    36. param:
    37.     PARAM EQUAL PARAM
    38.     ;
    39.  
    40. query:
    41.     DML tables DML PARAM DML tables
    42.     |DML tables DML PARAM
    43.     ;
    44.  
    45. tables:
    46.     param DELIM param |
    47.     param DELIM param COMMA tables
    48. %%
    49.  
    50. int main(int argc, char *argv[]){
    51.     if (argc!=2){
    52.     printf("vvedite: %s infile\n",argv[0]);
    53.     return 0;
    54.     }
    55.     yyin = fopen(argv[1], "r");
    56.     if (yyin!=NULL){
    57.     yyparse();
    58.     return 1;
    59.     }
    60.     else{
    61.     printf("nepalocilos otkrit fail\n");
    62.     return 0;
    63.     }
    64. }    
    65.  
    66. void yyerror(char *s){
    67.     extern int yylineno;
    68.     printf("\tOsibka %d stroka : '%s'\n\n",yylineno,yytext);
    69. }
    Пробую выполнить
    получаю
    тоесть на вот этом месте
    (красным выделил)
    Если переправляю в коде сканера
    Код (Text):
    1. [a-zA-Z0-9:\\~\.]+
    то тоже получаю ошибку.
    Сам символ точки мне нужно распозновать только в query части (в анализаторе)
    Другими словами тут
    но не тут (где у меня ошибка и возникает)
    Подскажиет пожалуйста, как быть?

    P.S. Цвета подсветки только неособо хорошо вышли
     
  2. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    может у кого-нибудь есть какая-нибудь идея возникла, как тут быть? :)
     
  3. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Сходить на профильный форум. Например на opennet.ru