0 / 0 / 0
Регистрация: 06.11.2015
Сообщений: 63
1

Лексический анализатор

02.02.2019, 21:35. Показов 3540. Ответов 1
Метки нет (Все метки)

Здравствуйте.

написать программу, которая выполняет лексический анализ входного текста в соответствии с заданием и порождает таблицу лексем с указанием их типов и значений. Программа должна выдавать сообщения о наличие во входном тексте ошибок,которые могут быть обнаружены на этапе лексического анализа.
У меня проблема с кодом,с чтением литералов -‘%’789/456*123-0.=+, не понимаю, как сделать анализатор чтобы читал их.....
Я буду благодарен, если поможете.


читаемый текст:

constructor TCalculator.Init;
constKeyChar: array[0..19] of Char = 'C'#27'%'#241'789/456*123-0.=+';
var I: Integer; P: PView; R: TRect;
Begin
R.Assign(5, 3, 29, 18); inherited Init(R, 'Calculator');
Options := Options or ofFirstClick;
for I := 0 to 19 do P:=New(PButton, cmCalcButton);
P^.Options := P^.Options and not ofSelectable;
Insert(P);
R.Assign(3, 2, 21, 3);
Insert(New(PCalcDisplay, Init(R)));
End;

Keywords: constructor, const, array, var, Begin, inherited, for, do, new, ad, of, char, Integer, PView, TRect, Assign, or, to, do, and, not, End
ID: TCalculator, Init, I,KeyChar, P, R, Options, ofFirstClick, New, PButton, cmCalcButton, ofSelectable, Insert, PCalcDisplay
Delimiter: [ ], =, :=, ( ),^; : .. # .
Number: 0, 19, 5, 3, 29, 18, 2, 21, 27, 241
Literal: ‘C’, ‘%’789/456*123-0.=+, Calculator

грамматика:
<ID>::=letter | <ID>letter
<NUM>::=digit | <NUM>digit
<DELIMITER>::=[| ] |= |(| )| ^| ;| :| # |.
<DELIMITER2>::= <POINT>. |<COLON> =
<POINT>::=.
<COLON>::=:

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
142
143
144
145
146
147
148
149
150
151
152
153
#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include <string>
#include <iomanip>
 
using namespace std;
 
string mas[1000][2];
int num = 0;
int isKeyword(char buffer[])
{
    char keywords[22][12] = { "constructor", "const", "array", "var", "Begin", "inherited", "for", "do", "new", "ad", "of", "char", "Integer", "PView", "TRect", "Assign", "or", "to", "do", "and", "not", "End" };
    int i, flag = 0;
    for (i = 0; i < 22; i++)
    {
        if (strcmp(keywords[i], buffer) == 0)
        {
            flag = 1;
            break;
        }
    }
    return flag;
}
 
 
 
int main()
{
    char ch, buffer[50] = "\0", buffer2[3] = "\0";
    ifstream fin("programLD1.txt");
    int i = 0, j = 0, k = 0;
    char delimiter[] = "[],:=()^;:#.'";
    bool isdelim, isliteral = false;
    char DoubleD = 0;
    char DD = 0;
    if (!fin.is_open())
    {
        cout << "error while opening the file\n";
        exit(0);
    }
    while (!fin.eof())
    {
        ch = fin.get();
        isdelim = false;
        if (!ch == '=' || !ch == '>')
            DoubleD = 0;
        if (!isdigit(ch))
            DD = 0;
        if (ch == '\'')
        {
            if (isliteral)
            {
                buffer[j] = '\0';
                j = 0;
                mas[num][0] = "Literal";
                mas[num][1] = buffer;
                num++;
            }
            isliteral = !isliteral;
            isdelim = true;
        }
        if (!isalnum(ch) && !(ch == ' ' || ch == '\n') && !isliteral)
        {
            isdelim = true;
        }
        if (isdigit(DD) && isdigit(ch))
        {
            buffer2[k] = '\0';
            k = 0;
            num--;
            mas[num][1].clear();
            buffer2[k++] = DD;
            buffer2[k++] = ch;
            mas[num][0] = "Number";
            mas[num][1] = buffer2;
            num++;
        }
        else if (isdigit(ch) && !(isdelim) && !isliteral)
        {
            DD = ch;
            mas[num][0] = " Number";
            mas[num][1] = ch;
            num++;
        }
        else
            if ((ch == ' ' || ch == '\n' || isdelim) && (j != 0) && !isliteral)
            {
                buffer[j] = '\0';
                j = 0;
                if (isKeyword(buffer) == 1)
                {
                    mas[num][0] = "KeyWords";
                    mas[num][1] = buffer;
                    num++;
                }
                else
                {
                    mas[num][0] = "ID";
                    mas[num][1] = buffer;
                    num++;
                }
            }
        if ((DoubleD == ':'&& ch == '=') || (DoubleD == '<'&& ch == '>'))
        {
            buffer2[k] = '\0';
            k = 0;
            num--;
            mas[num][1].clear();
            buffer2[k++] = DoubleD;
            buffer2[k++] = ch;
            mas[num][0] = "Delimiter";
            mas[num][1] = buffer2;
            num++;
        }
        else if (isdelim == true && ch != EOF)
        {
            if (ch == ':' || ch == '<')
                DoubleD = ch;
            isdelim = false;
            for (i = 0; i < 13; ++i)
            {
                if (ch == delimiter[i])
                {
                    mas[num][0] = "Delimiter";
                    mas[num][1] = ch;
                    num++;
                    isdelim = true;
                }
            }
            if (isdelim == false)
            {
                mas[num][0] = "Error";
                mas[num][1] = ch;
                num++;
            }
        }
        if ((isalpha(ch) && !isdelim) || (ch == ' ' && isliteral) || (ch == '-' && isliteral))
        {
            buffer[j++] = ch;
        }
    }
    fin.close();
    cout << '\n' << endl;
    for (int i = 0; i < num; i++)
    {
        cout << mas[i][0] << setw(20) << mas[i][1] << setw(25) << left << endl;
    }
    system("pause");
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2019, 21:35
Ответы с готовыми решениями:

Лексический анализатор
Доброго времени суток. Сразу скажу, что я не прошу написать какую-либо программу, а лишь хочу...

Лексический анализатор
Написал программу, я надеюсь, лексического анализатора для конкретного куска программы. В программе...

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

лексический анализатор на С++
Написать лексический анализатор на С++: разделители: , . ; бинарные операции: + - * / унарные...

1
1463 / 1005 / 455
Регистрация: 30.10.2017
Сообщений: 2,793
03.02.2019, 02:34 2
У Страуструпа в книге довольно подробно расписан процесс разработки калькулятора с использованием грамматик.
http://www.stroustrup.com/Prog... 7/e7-1.cpp
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2019, 02:34
Помогаю со студенческими работами здесь

Лексический анализатор текста
Разработать лексический анализатор, который реализует конечный автомат для поиска во входном потоке...

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

Лексический анализатор языка лисп
нужно написать лексический анализатор языка лисп

Лексический анализатор - граф перехода КА
Здравствуйте Уважаемые Форумчане. Описание: входной язык содержит логические выражения,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru