Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
New0ne
23 / 3 / 0
Регистрация: 14.08.2013
Сообщений: 10
1

Flex и Bison

22.09.2013, 16:38. Просмотров 3609. Ответов 3
Метки нет (Все метки)

Добрый день!
Уже все кипит от собственно всего этого. Нужно написать
1. Лексический анализатор (Flex)
2. Синтаксический анализатор (Bison)
Ну, то есть с помощью этих утилит сгенерировать файлы описания подключить это все к Си и скомпилировать.
В качестве задания дан текстовый файл содержащий:

Сводный перечень услуг Кол-во Стоимость Сумма
Абонентская плата - - 200
Междугородняя связь 25 17 425
Международная связь 10 56 560



В итоге нужно вывести еще одну строку:

Итого предоставлено услуг 1185

У меня есть файлы описания подобного задания.
Хотелось просто разобраться в коде.

Файлы описания имеют вид:
Определения
%%
Правила
%%
Пользовательский код

Символы между секциями %% являются разделителями.



Файл описания Flex:
Код
// Секция определений
%{
#include <windows.h> 
#include <stdio.h>
#define YYDEBUG 1
int yylex();
%}
%option	yylineno
%option	noyywrap
%option	never-interactive

Digit		[0-9]
AP_Znachenie		({Digit}+)
AP_NEWLINE		\n\r|\r\n|\n|\r
AP_TAB			[\t]
%%
//Секция правил
%{
#include <windows.h>
#include <stdio.h>
extern FILE *yyin, *yyout;
int yylex();
%}
%option noyywrap
%option yylineno
%option never-interactive
Digit				[0-9]
AP_Znachenie		({Digit}+)
AP_NEWLINE		\n\r|\r\n|\n|\r
AP_TAB			[\t]
%%
{AP_Znachenie}				{
							yylval.string =strdup(yytext);
							return AP_Znachenie;
					}
{AP_TAB}				{
							yylval.string = strdup(yytext);
							return AP_TAB;
					}
{AP_NEWLINE}			{
							yylval.string = strdup(yytext);
							return AP_NEWLINE;
					}
%%
//Пользовательский код 

%%
void main()
{
	/*int iRes;*/
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	//yydebug = 0;
	

	yyin = fopen("D:\\GnuWin32\\bin\\task.txt","r");
	if (!yyin) {
		printf("не удалось открыть входной файл\n");
		getchar();
		return;
	}
		if ( yyparse() != 0 ) {
		printf( "Синтаксическая ошибка\n" );
	}
	else {
		printf( "Ok\n" );
	}
		/*while ((iRes = yylex()) > 0) 
		printf("%d\n", iRes);
	*/
	fclose( yyin );
	getchar();
}
__

Опыта с Си не имею вообще.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2013, 16:38
Ответы с готовыми решениями:

flex/bison
Нужно по заданию в универе написать свой язык разметки типо html и браузер которыйбы мог...

Flex-symbol constant: Как правильно записать структуру
Всем привет, есть код: %{ #if defined _WIN32 #include &lt;io.h&gt; // Для isatty #elif...

Qt и antlr flex/bison
Кто-нибудь сталкивался с подклчением к Qt antlr или bison/flex ? я 3 дня ищу в интернете, ничего...

Парсер C++ + bison + flex
Нужно написать парсер для разбора текста и тегов которыми этот текст обрамлён. Препод предложил...

Flex and bison and VS2010
Вообщем нужно использовать Flex Bison Visual Studio 2010 совместно . Пишу вот такой...

3
gazlan
3163 / 1922 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
22.09.2013, 19:47 2
Цитата Сообщение от New0ne Посмотреть сообщение
Flex и Bison
Вы под *nix пишете? Судя по "GnuWin32" - нет. И вам нужны именно эти древние инструменты? При том, что с C у вас проблемы?

У вас должно быть четыре лексемы, к примеру : String, Int, Nothing, WS и грамматика вида:

C++
1
2
Biii_line: String WS Value WS Value WS Value EOL
Value: Int | Nothing
Возьмите компилятор знакомого вам языка и найдите под него генератор попроще, с EBNF (Coco/R, например).

И используйте тэги форматирования, читать ваш код невозможно.
0
New0ne
23 / 3 / 0
Регистрация: 14.08.2013
Сообщений: 10
26.09.2013, 09:58  [ТС] 3
Цитата Сообщение от gazlan Посмотреть сообщение
Вы под *nix пишете? Судя по "GnuWin32" - нет. И вам нужны именно эти древние инструменты? При том, что с C у вас проблемы?

У вас должно быть четыре лексемы, к примеру : String, Int, Nothing, WS и грамматика вида:

C++
1
2
Biii_line: String WS Value WS Value WS Value EOL
Value: Int | Nothing
Возьмите компилятор знакомого вам языка и найдите под него генератор попроще, с EBNF (Coco/R, например).

И используйте тэги форматирования, читать ваш код невозможно.

Так в том то и дело, что это задание обязали именно в таком порядке смастерить. Это лабораторная. Лекции нам не читали. Долгая история. Но все равно спасибо.
0
gazlan
3163 / 1922 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
26.09.2013, 10:11 4
Вот здесь поройтесь: Теория программирования. Парсеры и парсер-генераторы

Учтите, что Flex и Bison не сильно отличаются от Lex и Yacc, так что документация и примеры по ним будут вам полезны.
0
26.09.2013, 10:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2013, 10:11

Русскоязычная литература по Flex&Bison
Моя задача: необходимо создать или найти готовый лексер/парсер для разбора кода C++ и...

Синтаксический и семантический анализ во Flex и Bison
Здравствуйте) помогите пожалуйста написать анализ на C++ чтобы потом перевести его во Flex и...

bison++, flex++ и Qt. Изменить метод чтения данных лексического анализатора.
Здрасте. Я тут решил открыть для себя yacc и lex, и написать простенький калькулятор с окошком для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru