Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Синтаксический анализатор


Автор: Kofgarter 30.3.2009, 21:22
Помогите написать прогу, которая будет переводить номера в тексте -> из римского представления в арабское.
Использовать нужно анализаторы - bison и flex.

Лексический анализатор, который выделяет в тексте римские числа я написал (roman.l):
Код

%option noyywrap
%{
    int tokenCount=0;
%}
%%
[^IVX]+ { printf("%s", yytext); }
[IVX]+ { printf("{%s->...}",yytext); }
%%

main()
{
    yylex();
}


Когда откомпилируете и запустите: prog.exe < temp.txt - он выведет текст, вида: текст ... {IX->9} ... текст

Еще нашел лексический анализатор, который переводит римские числа в арабские:
Код

%option noyywrap

WS    [ \t]+

%%
    int total=0;

I    total += 1;
IV    total += 4;
V    total += 5;
IX    total += 9;
X    total += 10;
XL    total += 40;
L    total += 50;
XC    total += 90;
C    total += 100;
CD    total += 400;
D    total += 500;
CM    total += 900;
M    total += 1000;

{WS}    |
\n    return total;
%%
int main (void) 
{
   int number;

   number = yylex ();

   printf ("You have just entered: %d\n", number);
   return 0;
}


Но проблема в том, что ему без разницы, что мы введем IIX, или VIII… или IVX.

Как написать синтаксический анализатор, который будет проверять корректность записи римского числа?

Автор: Dmi3ev 30.3.2009, 23:10
Цитата

Как написать синтаксический анализатор, который будет проверять корректность записи римского числа?

руками  smile 
а если серьезно, то:
Kofgarter,  ты правда думаешь, что все тут всё побросают и будут тебе писать анализатор???
кроме поисков в интернете, может еще что-нибудь попробовать, например начать программировать...

Автор: Kofgarter 31.3.2009, 00:10
Dmi3ev smile , в таком случае Вам вообще не стоит заходить на форум!, а тратить свое время на более полезные вещи smile 

зы: видно Вы никогда не работали с анализаторами, они как раз рассчитаны для того чтобы не писать гениальные коды, типа:
Код

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    int i=0;
    string s1="I want change it";
    string s2="want";
    string s3="this is my new text";
    cout<<"before: "<<s1<<endl;
    while ((i=s1.find(s2,i+1))!=string::npos)
        s1.replace(i,s2.length(),s3);
    cout<<"after: "<<s1<<endl;
    system("pause");
    return 0;


smile 

Автор: Anikmar 31.3.2009, 00:17
Kofgarter
Цитата(Kofgarter @  31.3.2009,  00:10 Найти цитируемый пост)
для того чтобы не тратить время на написание гениальных кодов, типа

1. Данный гениальный код был написан в помощь, как обучающий.

Цитата(Kofgarter @  31.3.2009,  00:10 Найти цитируемый пост)
видно Вы никогда не работали с анализаторами,

2. Вы не предлагаете научиться работать в анализаторе, а спрашиваете вот это:
Цитата(Kofgarter @  30.3.2009,  21:22 Найти цитируемый пост)
Как написать синтаксический анализатор


3. Вам ответили совершенно ясно и четко - на столько, на сколько конкретный вопрос вы поставили.

4. Правила вежливости: Заходя в комнату, где беседует много людей, сначала прислушиваются к разговору, затем потихоньку вмешиваются и только через достаточно длительное время дают советы как вести себя этим людям в комнате.
А вы - с места в карьер. Нехорошо-с...

Автор: Kofgarter 31.3.2009, 00:20
Господа уже написал! 
В любом случае спасибо за проявленный к топику интерес  - Аш >58 просмотров!!  smile

Автор: Soah 31.3.2009, 00:28
Цитата(Kofgarter @  31.3.2009,  00:10 Найти цитируемый пост)
они как раз рассчитаны для того чтобы не писать гениальные коды, типа:

Ну так изобразите, маэстро smile 

Автор: Dmi3ev 31.3.2009, 00:44
Цитата

в таком случае Вам вообще не стоит заходить на форум!

это я уж без тебя разберусь...
Цитата

а тратить свое время на более полезные вещи 

это тоже осилю без тебя...
Цитата

видно Вы никогда не работали с анализаторами

из чего это видно? я как-то делал анализатор, правда математических выражений...
Цитата

они как раз рассчитаны для того чтобы не писать гениальные коды, типа...

это был пример, за который, кстати, человек сказал спасибо, поэтому не понимаю что ты этим хочешь сказать...
Цитата

они как раз рассчитаны для того чтобы не писать гениальные коды, типа...

ну не пиши... я не заставляю... если тебе ничего писать не надо (все уже готово), тогда чего ты тут делаешь???
короче, Kofgarter, выкладывай свои наработки, задумки, тогда поговорим...  smile 
а пустословить и оскорблять на расстоянии - много ума не надо...  smile 

PS если бы ты был рядом, был бы не так дерзок  smile

Добавлено через 34 секунды
Цитата

Ну так изобразите, маэстро 

 smile  smile 

Автор: Kofgarter 31.3.2009, 01:10
Та пожалуйста, надеюсь Вам пригодится! smile

Код

%{
     void yyerror(char *);
     int last = 0;
%}

%token blank numeral
%start text
%%

text 
    : number
    {
            return $1; 
            $$=$1;
    }
    | text blank number
    {
            return $3; 
            $$=$3; 
            last=0; 
    };

number
    : numeral 
    { 
            last=$$=$1; 
    }
    | numeral number 
    { 
            if ($1 >= last)
                   $$ = $2 + (last=$1);
            else 
                   $$ = $2 - (last=$1); 
    };
%%

#include "lex.yy.c"

void yyerror(char * s)
yacc error handler *
{
    fprintf (stderr, "%s\n", s);
}
int main(void) 
{
    return yyparse();
}


Dmi3ev, вот на что идет время! Вопрос задавался господам которые могут сразу ответить, если хотите - экспертам!
А давать советы в таком духе, я Вас не просил. Прочтите первое предложение!

Тема закрыта!

Автор: zim22 31.3.2009, 08:03
 smile 
Цитата(Kofgarter @  31.3.2009,  01:10 Найти цитируемый пост)
Тема закрыта!

а вот и нет  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)