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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти в матрице самую длинную цепочку подряд стоящих 0 по горизонтали или вертикали http://www.cyberforum.ru/cpp-beginners/thread877581.html
Матрица состоит из 0 и 1. Найти в ней самую длинную цепочку подряд стоящих 0 по горизонтали или вертикали. Для ориентации поиска использовать функцию. Заранее благодарна))
C++ Дано натуральное число N. Вычислить Помогите решить задачу до завтра, зачет по информатике)) . Дано натуральное число N. Вычислить s=\sum_{k=1}^{N}{(-1)}^{k+1}*\prod_{m=1}^{2k}cos(m+1/2k) http://www.cyberforum.ru/cpp-beginners/thread877571.html
Дано натуральное число N>2. Вычислить C++
Помогите решить задачу: Дано натуральное число N>2. Вычислить \sum_{k=2}^{N}\prod_{i=1}^{k-1}sin(\pi+i/k) Добавлено через 20 минут S=\sum_{k=2}^{N}\prod_{i=1}^{k-1}sin(\pi+i/k)
C++ Дано натуральное число N. Вычислить
Тут еще более или менее понятно, но все-таки хотелось бы сверить... 3.Дано натуральное число N. Вычислить S=\sum_{i=1}^{N}{i!/(N+i)!} Буду очень признателен...
C++ Дано натуральное число N. Вычислить http://www.cyberforum.ru/cpp-beginners/thread877549.html
Тут еще более или менее понятно, но все-таки хотелось бы сверить... 2.Дано натуральное число N. Вычислить S=\sum_{i=1}^{N}\sum_{k=0}^{i}{(i-k)/(i+k)} Буду очень признателен...
Visual C++ Как в MFC грамотно обработать деление на 0? Стыдновато за глупый вопрос, но сам пока не додумался. пишу несложную программу для работы с комплексными числами, возникла ситуация: надо как-то обработать деление на 0. Ввод, естественно, через edit-форму. В консоли все несложно было, а тут как - пока непонятно. Ввод комплексного числа выглядит примерно так: в одно окошко edit control поступает CString строка, и с помощью нехитрых 30 строк... подробнее

Показать сообщение отдельно
gazlan
3089 / 1864 / 278
Регистрация: 27.08.2010
Сообщений: 5,023
Записей в блоге: 1
26.05.2013, 01:14     Синтаксический анализатор. Формула
Упрощенный (неклассический, без стека) 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;
}
 
Текущее время: 17:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru