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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
papik1234567890
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 14
24.05.2013, 22:59     Синтаксический анализатор. Формула #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++
синтаксический анализатор C++
Синтаксический анализатор C++
простейший синтаксический анализатор(Распознавание числа) C++
C++ Синтаксический анализатор понятия скобки
C++ Разработать синтаксический анализатор
Реализовать синтаксический анализатор языка C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gazlan
2867 / 1815 / 272
Регистрация: 27.08.2010
Сообщений: 4,919
Записей в блоге: 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;
}
Yandex
Объявления
26.05.2013, 01:14     Синтаксический анализатор. Формула
Ответ Создать тему
Опции темы

Текущее время: 03:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru