Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [yacc] Подскажите как правильно сделать 
V
    Опции темы
Ak47black
  Дата 5.10.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Здравствуйте.
Сделал вот такой тестовый пример проявляющий суть
Например есть вот такой фрагмент языка (всё есть в прикреплённом файле включая makefile)
Код

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;
SELECT Titles.TitleID, Titles.Artist, Titles.Title, Titles.Copyright, Titles.Label, Titles.ReleaseDate, Titles.NumTracks, Titles.NumMenus

Код сканера
Код

%{
    #include "y.tab.h"
%}

%%
[\n]+                            { yylineno++; return NEWLINE;}
[0-9]+                            return NUMBER;
[a-zA-Z0-9:\\~]+                return PARAM;
=                                return EQUAL;    
;                                return COMCOLM;
,                                return COMMA;
\.                                return DELIM;
`                                return UPCOMMA;
"SELECT"|"FROM"|"ORDER BY"        return DML;
[\t ]                            return TABORSPACE;
%%

int yywrap(void) {
    return 1;
}

Код анализатора
Код


%{
#include <stdio.h>
int yylex(void);
extern int yylineno;
extern FILE *yyin;
extern char* yytext;
void yyerror(char *);
%}

%token NEWLINE
%token NUMBER
%token PARAM
%token EQUAL
%token COMCOLM
%token COMMA
%token DELIM
%token UPCOMMA
%token DML
%token TABORSPACE

%%
start:
    params lines query
    ;
    
lines:
    NEWLINE |
    lines NEWLINE
    ;
    
params:
    param COMCOLM |
    param COMCOLM params
    ;
    
param:
    PARAM EQUAL PARAM 
    ;

query:
    DML tables DML PARAM DML tables 
    |DML tables DML PARAM
    ;

tables:
    param DELIM param |
    param DELIM param COMMA tables
%%

int main(int argc, char *argv[]){
    if (argc!=2){
    printf("vvedite: %s infile\n",argv[0]);
    return 0;
    }
    yyin = fopen(argv[1], "r");
    if (yyin!=NULL){
    yyparse();
    return 1;
    }
    else{
    printf("nepalocilos otkrit fail\n");
    return 0;
    }
}    

void yyerror(char *s){
    extern int yylineno;
    printf("\tOsibka %d stroka : '%s'\n\n",yylineno,yytext);
}


Пробую выполнить 
Цитата

./prog Sample42.trm

получаю
Цитата

Osibka 1 stroka : '.'

тоесть на вот этом месте
Цитата

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;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;
SELECT Titles.TitleID, Titles.Artist, Titles.Title, Titles.Copyright, Titles.Label, Titles.ReleaseDate, Titles.NumTracks, Titles.NumMenus, Titles.PlayList, Titles.TitleQuery  FROM `D:\DOCUME~1\Administrator\APPLIC~1\MICROS~1\CDPLAY~1\DeluxeCD`.Titles Titles  ORDER BY Titles.Artist, Titles.Title

(красным выделил)
Если переправляю в коде сканера
Код

[a-zA-Z0-9:\\~\.]+

то тоже получаю ошибку.
Цитата

 warning, rule cannot be matched

Сам символ точки мне нужно распозновать только в query части (в анализаторе)
Другими словами тут
Цитата

SELECT Titles.TitleID, Titles.Artist, Titles.Title, Titles.Copyright, Titles.Label, Titles.ReleaseDate, Titles.NumTracks, Titles.NumMenus, Titles.PlayList, Titles.TitleQuery  FROM `D:\DOCUME~1\Administrator\APPLIC~1\MICROS~1\CDPLAY~1\DeluxeCD`.Titles Titles  ORDER BY Titles.Artist, Titles.Title

но не тут (где у меня ошибка и возникает)
Цитата

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;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;

Подскажиет пожалуйста, как быть?

Это сообщение отредактировал(а) Ak47black - 5.10.2010, 20:27

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  a1.zip 1,65 Kb
PM MAIL   Вверх
Ak47black
  Дата 6.10.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



может у кого-нибудь есть какая-нибудь идея возникла, как тут быть? smile

Это сообщение отредактировал(а) Ak47black - 6.10.2010, 11:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Добро пожаловать в раздел "Другие языки" форума Vingrad!

Void
Void

Раздел посвящён различным языкам программирования, для которых (в силу невысокой популярности) нет отдельного раздела (GPSS, Lua, MATLAB, Ada, Forth, Smalltalk, Tcl, REXX, AWK и др.)

  • Обязательно следуйте правилам Форума.
  • Пожалуйста, прочитайте и следуйте рекомендациям по работе в разделе и навигации по Форуму.
  • Для вставки текстов исходных кодов используйте подсветку синтаксиса из выплывающего списка Код в форме ответа. Если Ваш язык в списке не представлен, то используйте тег: [code=ваш_язык]код[/code], например, [code=ada]код[/code]. Если в будущем подсветка синтаксиса для указанного языка будет реализована, исходный код преобразится.
  • Помните, один вопрос - одна тема.

Приятного времяпрепровождения! С уважением, Void, kemiisto .

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Другие языки | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.