Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
papik1234567890
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 14
1

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

24.05.2013, 22:59. Просмотров 1350. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2013, 22:59
Ответы с готовыми решениями:

синтаксический анализатор
Доброго времени суток. Подскажите как написать синтаксический анализатор...

Синтаксический анализатор
Нужна помощь именно с алгоритмом. Задание звучит так - проверить корректность...

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

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

Рекурсия, Синтаксический анализатор
нужно сделать Построить синтаксический анализатор для понятия &quot;простое...

1
gazlan
3141 / 1917 / 311
Регистрация: 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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2013, 01:14

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

Синтаксический анализатор. Рекурсия
Пожалуста, помогите кто чем может... знаю, что это не так сложно, но не...

Лексический, синтаксический анализатор c++
Помогите пожалуйста, мне очень сложно понять как это делать( Разработать...


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

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

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