Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
papik1234567890
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 14
#1

Синтаксический анализатор. Формула - C++

24.05.2013, 22:59. Просмотров 1171. Ответов 1
Метки нет (Все метки)

Нужно построить синтаксический анализатор для понятия формула. Программа выдает ошибки.
вот условие:
Синтаксический анализатор. Формула

и вот мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <string.h>
#include <Windows.h>
//
using namespace std;
//
char str[1000];
int pos=0;
//
bool formula();
bool zifra();
bool znak();
 
bool formula(){
    bool f1=formula();
    bool z = zifra();
    if(z)
        return true;
    pos++;
        if (f1)
            return true;
        
        else
            return false;
 
//
        
    bool zn=znak();
    if((str[pos]==f1) && (str[pos+1]==zn) && (str [pos+2]==f1)){
        int pos_origin=pos;
        pos+=2;
        if(!formula()){
            return false;
        }
 
        return true;
    }
 
    else
        return false;
 
}
//
bool zifra(){ // 
    int pos_origin;
 
    if ((str[pos]=='1')||(str[pos]=='2')||(str[pos]=='3')||(str[pos]=='4')||(str[pos]=='5')||(str[pos]=='6')||(str[pos]=='7')||(str[pos]=='8')||(str[pos]=='9')){
        pos++;
        return true;
        
    }
    
    else
        return false;
}
//
bool znak(){
    
    if ((str[pos+1]=='+')||(str[pos+1]=='-')||(str[pos+1]=='*')){
        pos++;
        return true;
    }
    else
        return false;
}
//
 
//
int main(){
    //
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    //
    cout<<"Введите формулу:"<<endl;
    cin>>str;
    bool frm=formula();
    if(frm)
        cout<<"Правильно!"<<endl;
    else 
        cout<<"Не верно!"<<endl;
    //
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2013, 22:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Синтаксический анализатор. Формула (C++):

Синтаксический анализатор - C++
никак не могу разобраться с заданием, может быть кто-то сталкивался 1.Построить синтаксические диаграммы для следующих конструкций; ...

Синтаксический анализатор - C++
Нужна помощь именно с алгоритмом. Задание звучит так - проверить корректность написания заголовка функции. Прототипы не учитываются. ...

синтаксический анализатор - C++
Доброго времени суток. Подскажите как написать синтаксический анализатор кода(паскаль). Как это правильно делать? как это сделано в средах...

Синтаксический анализатор - C++
Нужно написать синтаксический анализатор для одного маленького фрагмента программы, т.е. проверка правильности грамматического построения...

Разработать синтаксический анализатор - C++
Может кто помочь понять как должна выглядеть программа подобного вида? си++ знаю, но с этими анализаторами что то я не догнал( : ...

Синтаксический анализатор. Рекурсия - C++
Пожалуста, помогите кто чем может... знаю, что это не так сложно, но не представляю, как реализовывать. необходимо сделать с помощью...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gazlan
3131 / 1906 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
26.05.2013, 01:14 #2
Упрощенный (неклассический, без стека) a la LL(1) разбор:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
 
static char*   pszStatement = "1+2-3*4";
 
enum TOKEN 
{
   TKN_NONE,
   TKN_ERROR,
   TKN_SIGN,
   TKN_DIGIT,
   TKN_FORMULA,
   TKN_EOL
};
 
bool IsSign(char Char)
{
   if ((Char == '+') || (Char == '-') || (Char == '*'))
   {
      return true;
   }
 
   return false;
}
 
bool IsDigit(char Char)
{
   if ((Char >= '0') && (Char <= '9'))
   {
      return true;
   }
 
   return false;
}
 
TOKEN Lexer(const char* const pText)
{        
   static int     iPos = 0;
 
   char  Char = pText[iPos++];
 
   if (!Char)
   {
      return TKN_EOL;
   }
   else if (IsSign(Char))
   {
      return TKN_SIGN;
   }
   else if (IsDigit(Char))
   {  
      return TKN_DIGIT;
   }
   else
   {
      return TKN_ERROR;
   }
}
 
bool Parser()
{
   TOKEN    Sign = TKN_NONE;
   TOKEN    Left = Lexer(pszStatement);
 
   if (Left != TKN_DIGIT)
   {
      return false;
   }
 
   Left = TKN_FORMULA;
 
   while (true)
   {
      TOKEN    Next = Lexer(pszStatement);
 
      switch (Next)
      {
         case TKN_ERROR:
         {
            return false;
         }
         case TKN_DIGIT:
         {
            if (Sign == TKN_SIGN)
            {
               Sign = TKN_NONE;
               Left = TKN_FORMULA;
            }
            else
            {
               return false;
            }
 
            break;
         }
         case TKN_SIGN:
         {
            if (Sign == TKN_NONE)
            {
               Sign = TKN_SIGN;
            }
            else
            {
               return false;
            }
 
            break;
         }
         case TKN_FORMULA:
         {  
            return false; // Should be Never reached !
         }
         case TKN_EOL:
         {
            if (Left == TKN_FORMULA)
            {
               return true;
            }
            else
            {
               return false;
            }
         }
      }
   }
}
 
int main(int argc,char** argv)
{              
   if (Parser())
   {
      printf("Correct\n");
   }
   else
   {
      printf("Incorrect\n");
   }
 
   return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2013, 01:14
Привет! Вот еще темы с ответами:

Синтаксический анализатор понятия скобки - C++
Здравствуйте,помогите пожалуйста с построение синтаксического анализатора понятия скобки скобки::=A|B(скобки скобки) Заранее спасибо...

Реализовать синтаксический анализатор языка - C++
Ребят,может,сможет кто помочь. Почти весь день сидел писал программу, уже просто мозг высох и отказывается работать, перечитал похожие...

Синтаксический анализатор понятия текст со скобками - C++
С помощью рекурсии необходимо реализовать синтаксический анализатор понятия текст_со_скобками. текст_со_скобками::=элемент | элемент...

Количество строк в файле. Синтаксический анализатор - C++
Подскажите пожалуйста. Я написал синтаксический анализатор. Он считывает некоторое выражение из текстового файла. Мне хотелось бы знать...


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

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

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