Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
Cандальная шляпа
 Аватар для Doctor Nano
42 / 42 / 36
Регистрация: 12.01.2012
Сообщений: 187

Компилятор. Лексический анализ кода Pascal

12.10.2015, 12:56. Показов 5677. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Пишу лексический анализатор для кодов Pascal.
И как вывести переменные которые используются в описание var?
Тут есть мыслишка (ниже код), только получается как надо.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//разобъем текст в строке на части
splitText = codeText.Split(new string[]{" ",",",".",";",":",
"=","(",")","+","-","{","}","[","]","\r\n"},StringSplitOptions.RemoveEmptyEntries );
 
for (int i = 0; i < splitText.Length; i++)
{
     if (splitText[i] == "var")
     {
          i++;
          while (splitText[i] != "begin" && splitText[i] != "procedure" && splitText[i] != "function")
          {
                while (splitText[i] != "integer" && splitText[i] != "real"
                && splitText[i] != "string" && splitText[i] != "char")
                {
                    listBox2.Items.Add(splitText[i++]);
                 }
                 i++;
           }
       }
}
И подскажите, как избавиться от комментариев в коде?

Пример кода паскаль
program Cradle3;
uses crt;

const TAB = ^I;CR=^M;
var Look: char; { Lookahead Character }

{ Read New Character From Input Stream }
procedure GetChar;
begin
Read(Look);
end;

{ Report an Error }
procedure Error(s: string);
begin
WriteLn;
WriteLn(^G, 'Error: ', s, '.');
end;

{ Report Error and Halt }
procedure Abort(s: string);
begin
Error(s);
Halt;
end;

{ Report What Was Expected }
procedure Expected(s: string);
begin
Abort(s + ' Expected');
end;

{ Recognize an Alpha Character }
function IsAlpha(c: char): boolean;
begin
IsAlpha:=upcase(c)in['A'..'Z'];
end;

{ Recognize a Decimal Digit }
function IsDigit(c: char): boolean;
begin
IsDigit:=c in['0'..'9'];
end;

{ Recognize an Alphanumeric }
function IsAlNum(c: char): boolean;
begin
IsAlNum := IsAlpha(c) or IsDigit(c);
end;

{ Recognize an Addop }
function IsAddop(c: char): boolean;
begin
IsAddop := c in ['+', '-'];
end;

{ Recognize White Space }
function IsWhite(c: char): boolean;
begin
IsWhite := c in [' ', TAB];
end;

{ Skip Over Leading White Space }
procedure SkipWhite;
begin
while IsWhite(Look) do
GetChar;
end;

{ Match a Specific Input Character }
procedure Match(x: char);
begin
if Look <> x then Expected('''' + x + '''')
else
begin
GetChar;
SkipWhite;
end;
end;


{ Get an Identifier }
function GetName: string;
var Token: string;
begin
Token := '';
if not IsAlpha(Look) then Expected('Name');
while IsAlNum(Look) do
begin
Token := Token + UpCase(Look);
GetChar;
end;
GetName := Token;
SkipWhite;
end;


{ Get a Number }
function GetNum: string;
var Value: string;
begin
Value := '';
if not IsDigit(Look) then Expected('Integer');
while IsDigit(Look) do
begin
Value := Value + Look;
GetChar;
end;
GetNum := Value;
SkipWhite;
end;


{ Output a String with Tab }
procedure Emit(s: string);
begin
Write(TAB, s);
end;

{ Output a String with Tab and CRLF }
procedure EmitLn(s: string);
begin
Emit(s);
WriteLn;
end;




{ Parse and Translate an Identifier }
procedure Ident;
var Name:string[8];
begin
Name := GetName;
if Look = '(' then
begin
Match('(');
Match(')');
EmitLn('BSR ' + Name);
end
else
EmitLn('MOVE ' + Name + '(PC),D0')
end;



{ Parse and Translate a Math Factor }
procedure Expression; Forward;
procedure Factor;
begin
if Look='(' then
begin
Match('(');
Expression;
Match(')');
end
else
if IsAlpha(Look) then Ident
else
EmitLn('MOVE #' + GetNum + ',D0');
end;



{ Recognize and Translate a Multiply }
procedure Multiply;
begin
Match('*');
Factor;
EmitLn('MULS (SP)+,D0');
end;

{ Rcognize and Translate a Divide }
procedure Divide;
begin
Match('/');
Factor;
EmitLn('MOVE (SP)+,D1');
EmitLn('DIVS D1,D0');
end;


{ Parse and Translate a Math Expression }
procedure Term;
begin
Factor;
while Look in ['*', '/'] do
begin
EmitLn('MOVE D0, (SP)');
case Look of
'*': Multiply;
'/': Divide;
else Expected('Mulop');
end;
end;
end;

{ Recognize and Translate a Subtract }
procedure Subtract;
begin
Match('-');
Term;
EmitLn('SUB (SP)+,D0');
EmitLn('NEG D0');
end;

{ Recognize and Translate an Add }
procedure Add;
begin
Match('+');
Term;
EmitLn('ADD (SP)+,D0');
end;

{ Parse and Translate an Expression }
procedure Expression;
begin
if IsAddop(Look) then
EmitLn('CLR D0')
else Term;

while IsAddop(Look) do
begin
EmitLn('MOVE D0,-(SP)');
case Look of
'+': Add;
'-': Subtract;
end;
end;
end;

procedure Assignment;
var Name: string[8];
begin
Name := GetName;
Match('=');
Expression;
EmitLn('LEA ' + Name + '(PC),A0');
EmitLn('MOVE D0,(A0)')
end;


{ Initialize }
procedure Init;
begin
GetChar;
SkipWhite;
end;

{ Main Program }
begin
Clrscr;
Init;
Assignment;
if Look<>CR then Expected('NewLine');
ReadKey;
end.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.10.2015, 12:56
Ответы с готовыми решениями:

Написать компилятор на языке C++/C# для программы на PASCAL
1. Произвести анализ заданного программного фрагмента на языке PASCAL и выделить все типы имеющихся в нем лексем. 2. Сформировать...

Компилятор одного кода с маленькими изменениями builder на C#
Мне надо сделать программу которая будет изменять проект например текстбокс1 это лабел3 а текстбокс2 это лабел5. и когда нажимаем...

Провести лексический анализ строки и сказать является ли она верным арифметическим выражением
Прошу сильно не пинать, т.к. только начал изучать дискретку. Есть некоторый алфавит состоящий из чисел типа double, и следующих...

4
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
12.10.2015, 13:29
Цитата Сообщение от Doctor Nano Посмотреть сообщение
Пишу лексический анализатор для кодов Pascal.
И как вывести переменные которые используются в описание var?
var - это ключевое слово.
Однако, конструкция var плюс имена переменных и их типы - это синтаксическая конструкция.
Поэтому нужен синтаксический анализатор тут.

Можно почитать книжку Компиляторы. Принципы, технологии и инструментарий.
Потом взять Coco/R с таким atg файлом.
Немного допилить его и получить нормальный парсер паскаля
С помощью которого извлечь нужную информацию из кода программы.
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
12.10.2015, 13:43
Doctor Nano,
Автомат (машина состояний, state machine):
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
 
namespace WindowsFormsApplication315
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            new Button { Parent = this, Text = "Start Lexer" }.Click += new System.EventHandler(bt_Click);
        }
 
        void bt_Click(object sender, System.EventArgs e)
        {
            var ofd = new OpenFileDialog {Filter = "Pascal|*.pas"};
            if(ofd .ShowDialog() == DialogResult.OK)
                Parse(ofd.FileName);
        }
 
        private void Parse(string file)
        {
            var text = File.ReadAllText(file);
            var lexer = new PascalLexer();
            foreach(var lex in lexer.Parse(text))
                Console.WriteLine(lex);
        }
    }
 
    class PascalLexer
    {
        private HashSet<string> operators = new HashSet<string> {"begin", "end", "function"};//and so on ....
 
        public IEnumerable<Lexem> Parse(string source)
        {
            foreach(var lex in RawParse(source))
            {
                if(lex.Type == LexemType.MultilineComment || lex.Type == LexemType.String) //строки и комментарии возвращаем как есть
                {
                    yield return lex;
                    continue;
                }
                
                if (lex.Type == LexemType.Identificator && lex.Content == "") continue;//игнорируем пустые идентификаторы
 
                if (operators.Contains(lex.Content)) lex.Type = LexemType.Operator;//есть в списке операторов? значит оператор
                else
                if (!char.IsLetterOrDigit(lex.Content[0])) lex.Type = LexemType.Separator;//сепаратор?
 
                //здесь можно обнаруживать другие типы лексем - числа, операторы , скобки и т.д.
                //...
 
                yield return lex;
            }
        }
 
        private IEnumerable<Lexem> RawParse(string source)
        {
            var lexem = new Lexem();
 
            foreach(var c in source)
            switch (lexem.Type)
            {
                case LexemType.String:
                    if (c == '\'')
                    {
                        yield return lexem;
                        lexem = new Lexem();
                    }
                    else
                        lexem.Content += c;
                    break;
 
                case LexemType.MultilineComment:
                    if (c == '}')
                    {
                        yield return lexem;
                        lexem = new Lexem();
                    }
                    else
                        lexem.Content += c;
                    break;
 
                default:
                    switch (c)
                    {
                        //space
                        case ' ':
                        case '\t':
                        case '\r':
                        case '\n':
                            yield return lexem;
                            lexem = new Lexem { Type = LexemType.Identificator };
                            break;
                        //start of string
                        case '\'':
                            yield return lexem;
                            lexem = new Lexem { Type = LexemType.String };
                            break;
                        //start of comment
                        case '{':
                            yield return lexem;
                            lexem = new Lexem { Type = LexemType.MultilineComment };
                            break;
                        //identificator
                        default:
                            if(!char.IsLetterOrDigit(c))
                            {
                                yield return lexem;
                                yield return new Lexem {Content = c.ToString(), Type = LexemType.Identificator};
                                lexem = new Lexem();
                            }else
                                lexem.Content += c;
                            break;
                    }
                    break;
            }
 
            yield return lexem;
        }
    }
 
    class Lexem
    {
        public LexemType Type;
        public string Content = "";
 
        public override string ToString()
        {
            return string.Format("{0}: {1}", Type, Content);
        }
    }
 
    enum LexemType
    {
        Identificator = 0, String, MultilineComment, Operator, Separator
    }
}
Результат для вашего файла:
Кликните здесь для просмотра всего текста
Identificator: program
Identificator: Cradle3
Separator: ;
Identificator: uses
Identificator: crt
Separator: ;
Identificator: const
Identificator: TAB
Separator: =
Separator: ^
Identificator: I
Separator: ;
Identificator: CR
Separator: =
Separator: ^
Identificator: M
Separator: ;
Identificator: var
Identificator: Look
Separator: :
Identificator: char
Separator: ;
MultilineComment: Lookahead Character
MultilineComment: Read New Character From Input Stream
Identificator: procedure
Identificator: GetChar
Separator: ;
Operator: begin
Identificator: Read
Separator: (
Identificator: Look
Separator: )
Separator: ;
Operator: end
Separator: ;
MultilineComment: Report an Error
Identificator: procedure
Identificator: Error
Separator: (
Identificator: s
Separator: :
Identificator: string
Separator: )
Separator: ;
Operator: begin
Identificator: WriteLn
Separator: ;
Identificator: WriteLn
Separator: (
Separator: ^
Identificator: G
Separator: ,
String: Error:
Separator: ,
Identificator: s
Separator: ,
String: .
Separator: )
Separator: ;
Operator: end
Separator: ;
MultilineComment: Report Error and Halt
Identificator: procedure
Identificator: Abort
Separator: (
Identificator: s
Separator: :
Identificator: string
Separator: )
Separator: ;
Operator: begin
Identificator: Error
Separator: (
Identificator: s
Separator: )
Separator: ;
Identificator: Halt
Separator: ;
Operator: end
Separator: ;
MultilineComment: Report What Was Expected
Identificator: procedure
Identificator: Expected
Separator: (
Identificator: s
Separator: :
Identificator: string
Separator: )
Separator: ;
Operator: begin
Identificator: Abort
Separator: (
Identificator: s
Separator: +
String: Expected
Separator: )
Separator: ;
Operator: end
Separator: ;
MultilineComment: Recognize an Alpha Character
Operator: function
Identificator: IsAlpha
Separator: (
Identificator: c
Separator: :
Identificator: char
Separator: )
Separator: :
Identificator: boolean
Separator: ;
Operator: begin
Identificator: IsAlpha
Separator: :
Separator: =
Identificator: upcase
Separator: (
Identificator: c
Separator: )
Identificator: in
Separator: [
String: A
Separator: .
Separator: .
String: Z
Separator: ]
Separator: ;
Operator: end
Separator: ;
MultilineComment: Recognize a Decimal Digit
Operator: function
Identificator: IsDigit
Separator: (
Identificator: c
Separator: :
Identificator: char
Separator: )
Separator: :
Identificator: boolean
Separator: ;
Operator: begin
Identificator: IsDigit
Separator: :
Separator: =
Identificator: c
Identificator: in
Separator: [
String: 0
Separator: .
Separator: .
String: 9
Separator: ]
Separator: ;
Operator: end
Separator: ;
MultilineComment: Recognize an Alphanumeric
Operator: function
Identificator: IsAlNum
Separator: (
Identificator: c
Separator: :
Identificator: char
Separator: )
Separator: :
Identificator: boolean
Separator: ;
Operator: begin
Identificator: IsAlNum
Separator: :
Separator: =
Identificator: IsAlpha
Separator: (
Identificator: c
Separator: )
Identificator: or
Identificator: IsDigit
Separator: (
Identificator: c
Separator: )
Separator: ;
Operator: end
Separator: ;
MultilineComment: Recognize an Addop
Operator: function
Identificator: IsAddop
Separator: (
Identificator: c
Separator: :
Identificator: char
Separator: )
Separator: :
Identificator: boolean
Separator: ;
Operator: begin
Identificator: IsAddop
Separator: :
Separator: =
Identificator: c
Identificator: in
Separator: [
String: +
Separator: ,
String: -
Separator: ]
Separator: ;
Operator: end
Separator: ;
MultilineComment: Recognize White Space
Operator: function
Identificator: IsWhite
Separator: (
Identificator: c
Separator: :
Identificator: char
Separator: )
Separator: :
Identificator: boolean
Separator: ;
Operator: begin
Identificator: IsWhite
Separator: :
Separator: =
Identificator: c
Identificator: in
Separator: [
String:
Separator: ,
Identificator: TAB
Separator: ]
Separator: ;
Operator: end
Separator: ;
MultilineComment: Skip Over Leading White Space
Identificator: procedure
Identificator: SkipWhite
Separator: ;
Operator: begin
Identificator: while
Identificator: IsWhite
Separator: (
Identificator: Look
Separator: )
Identificator: do
Identificator: GetChar
Separator: ;
Operator: end
Separator: ;
MultilineComment: Match a Specific Input Character
Identificator: procedure
Identificator: Match
Separator: (
Identificator: x
Separator: :
Identificator: char
Separator: )
Separator: ;
Operator: begin
Identificator: if
Identificator: Look
Separator: <
Separator: >
Identificator: x
Identificator: then
Identificator: Expected
Separator: (
String:
String:
Separator: +
Identificator: x
Separator: +
String:
String:
Separator: )
Identificator: else
Operator: begin
Identificator: GetChar
Separator: ;
Identificator: SkipWhite
Separator: ;
Operator: end
Separator: ;
Operator: end
Separator: ;

MultilineComment: Get an Identifier
Operator: function
Identificator: GetName
Separator: :
Identificator: string
Separator: ;
Identificator: var
Identificator: Token
Separator: :
Identificator: string
Separator: ;
Operator: begin
Identificator: Token
Separator: :
Separator: =
String:
Separator: ;
Identificator: if
Identificator: not
Identificator: IsAlpha
Separator: (
Identificator: Look
Separator: )
Identificator: then
Identificator: Expected
Separator: (
String: Name
Separator: )
Separator: ;
Identificator: while
Identificator: IsAlNum
Separator: (
Identificator: Look
Separator: )
Identificator: do
Operator: begin
Identificator: Token
Separator: :
Separator: =
Identificator: Token
Separator: +
Identificator: UpCase
Separator: (
Identificator: Look
Separator: )
Separator: ;
Identificator: GetChar
Separator: ;
Operator: end
Separator: ;
Identificator: GetName
Separator: :
Separator: =
Identificator: Token
Separator: ;
Identificator: SkipWhite
Separator: ;
Operator: end
Separator: ;
MultilineComment: Get a Number
Operator: function
Identificator: GetNum
Separator: :
Identificator: string
Separator: ;
Identificator: var
Identificator: Value
Separator: :
Identificator: string
Separator: ;
Operator: begin
Identificator: Value
Separator: :
Separator: =
String:
Separator: ;
Identificator: if
Identificator: not
Identificator: IsDigit
Separator: (
Identificator: Look
Separator: )
Identificator: then
Identificator: Expected
Separator: (
String: Integer
Separator: )
Separator: ;
Identificator: while
Identificator: IsDigit
Separator: (
Identificator: Look
Separator: )
Identificator: do
Operator: begin
Identificator: Value
Separator: :
Separator: =
Identificator: Value
Separator: +
Identificator: Look
Separator: ;
Identificator: GetChar
Separator: ;
Operator: end
Separator: ;
Identificator: GetNum
Separator: :
Separator: =
Identificator: Value
Separator: ;
Identificator: SkipWhite
Separator: ;
Operator: end
Separator: ;
MultilineComment: Output a String with Tab
Identificator: procedure
Identificator: Emit
Separator: (
Identificator: s
Separator: :
Identificator: string
Separator: )
Separator: ;
Operator: begin
Identificator: Write
Separator: (
Identificator: TAB
Separator: ,
Identificator: s
Separator: )
Separator: ;
Operator: end
Separator: ;
MultilineComment: Output a String with Tab and CRLF
Identificator: procedure
Identificator: EmitLn
Separator: (
Identificator: s
Separator: :
Identificator: string
Separator: )
Separator: ;
Operator: begin
Identificator: Emit
Separator: (
Identificator: s
Separator: )
Separator: ;
Identificator: WriteLn
Separator: ;
Operator: end
Separator: ;
MultilineComment: Parse and Translate an Identifier
Identificator: procedure
Identificator: Ident
Separator: ;
Identificator: var
Identificator: Name
Separator: :
Identificator: string
Separator: [
Identificator: 8
Separator: ]
Separator: ;
Operator: begin
Identificator: Name
Separator: :
Separator: =
Identificator: GetName
Separator: ;
Identificator: if
Identificator: Look
Separator: =
String: (
Identificator: then
Operator: begin
Identificator: Match
Separator: (
String: (
Separator: )
Separator: ;
Identificator: Match
Separator: (
String: )
Separator: )
Separator: ;
Identificator: EmitLn
Separator: (
String: BSR
Separator: +
Identificator: Name
Separator: )
Separator: ;
Operator: end
Identificator: else
Identificator: EmitLn
Separator: (
String: MOVE
Separator: +
Identificator: Name
Separator: +
String: (PC),D0
Separator: )
Operator: end
Separator: ;
MultilineComment: Parse and Translate a Math Factor
Identificator: procedure
Identificator: Expression
Separator: ;
Identificator: Forward
Separator: ;
Identificator: procedure
Identificator: Factor
Separator: ;
Operator: begin
Identificator: if
Identificator: Look
Separator: =
String: (
Identificator: then
Operator: begin
Identificator: Match
Separator: (
String: (
Separator: )
Separator: ;
Identificator: Expression
Separator: ;
Identificator: Match
Separator: (
String: )
Separator: )
Separator: ;
Operator: end
Identificator: else
Identificator: if
Identificator: IsAlpha
Separator: (
Identificator: Look
Separator: )
Identificator: then
Identificator: Ident
Identificator: else
Identificator: EmitLn
Separator: (
String: MOVE #
Separator: +
Identificator: GetNum
Separator: +
String: ,D0
Separator: )
Separator: ;
Operator: end
Separator: ;
....
1
20 / 19 / 4
Регистрация: 22.03.2018
Сообщений: 701
03.02.2019, 21:39
А можно проект выложить пожалуйста данного кода ?
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
 
namespace WindowsFormsApplication315
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            new Button { Parent = this, Text = "Start Lexer" }.Click += new System.EventHandler(bt_Click);
        }
 
        void bt_Click(object sender, System.EventArgs e)
        {
            var ofd = new OpenFileDialog {Filter = "Pascal|*.pas"};
            if(ofd .ShowDialog() == DialogResult.OK)
                Parse(ofd.FileName);
        }
 
        private void Parse(string file)
        {
            var text = File.ReadAllText(file);
            var lexer = new PascalLexer();
            foreach(var lex in lexer.Parse(text))
                Console.WriteLine(lex);
        }
    }
 
    class PascalLexer
    {
        private HashSet<string> operators = new HashSet<string> {"begin", "end", "function"};//and so on ....
 
        public IEnumerable<Lexem> Parse(string source)
        {
            foreach(var lex in RawParse(source))
            {
                if(lex.Type == LexemType.MultilineComment || lex.Type == LexemType.String) //строки и комментарии возвращаем как есть
                {
                    yield return lex;
                    continue;
                }
                
                if (lex.Type == LexemType.Identificator && lex.Content == "") continue;//игнорируем пустые идентификаторы
 
                if (operators.Contains(lex.Content)) lex.Type = LexemType.Operator;//есть в списке операторов? значит оператор
                else
                if (!char.IsLetterOrDigit(lex.Content[0])) lex.Type = LexemType.Separator;//сепаратор?
 
                //здесь можно обнаруживать другие типы лексем - числа, операторы , скобки и т.д.
                //...
 
                yield return lex;
            }
        }
 
        private IEnumerable<Lexem> RawParse(string source)
        {
            var lexem = new Lexem();
 
            foreach(var c in source)
            switch (lexem.Type)
            {
                case LexemType.String:
                    if (c == '\'')
                    {
                        yield return lexem;
                        lexem = new Lexem();
                    }
                    else
                        lexem.Content += c;
                    break;
 
                case LexemType.MultilineComment:
                    if (c == '}')
                    {
                        yield return lexem;
                        lexem = new Lexem();
                    }
                    else
                        lexem.Content += c;
                    break;
 
                default:
                    switch (c)
                    {
                        //space
                        case ' ':
                        case '\t':
                        case '\r':
                        case '\n':
                            yield return lexem;
                            lexem = new Lexem { Type = LexemType.Identificator };
                            break;
                        //start of string
                        case '\'':
                            yield return lexem;
                            lexem = new Lexem { Type = LexemType.String };
                            break;
                        //start of comment
                        case '{':
                            yield return lexem;
                            lexem = new Lexem { Type = LexemType.MultilineComment };
                            break;
                        //identificator
                        default:
                            if(!char.IsLetterOrDigit(c))
                            {
                                yield return lexem;
                                yield return new Lexem {Content = c.ToString(), Type = LexemType.Identificator};
                                lexem = new Lexem();
                            }else
                                lexem.Content += c;
                            break;
                    }
                    break;
            }
 
            yield return lexem;
        }
    }
 
    class Lexem
    {
        public LexemType Type;
        public string Content = "";
 
        public override string ToString()
        {
            return string.Format("{0}: {1}", Type, Content);
        }
    }
 
    enum LexemType
    {
        Identificator = 0, String, MultilineComment, Operator, Separator
    }
}
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
04.02.2019, 08:23
Советую почитать серию статей Руслана Спивака про написание интерпретатора Паскаля в 14 частях. Всё максимально подробно, понятно и интересно.
Жаль только, что серия не закончена, хотя автор обещал вернуться к созданию 15-ой части.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.02.2019, 08:23
Помогаю со студенческими работами здесь

Объяснение кода - лексический анализатор
Вот фрагмент кода, осуществляющий анализ кода текста программы (лексический анализ) и разделяющий ее впоследствии на лексемы (разделители,...

Лексический анализ выражений. Формы записи выражений
Уважаемые форумчане помогите пожалуйста с задачей: Заранее спасибо! Добавлено через 19 часов 59 минут нашел пример, но...

Лексический анализ выражений. Формы записи выражений
Написать программу, представляющую математические выражения в форме обратной польской записи. Используя полученную бесскобочную форму...

Лексический анализ выражений. Формы записи выражений
Уважаемые программисты помогите пожалуйста с заданием!!!!!!!!! Задание: Написать программу, представляющую математические выражения в...

Компилятор для Pascal на языке C#
Доброго времени суток Задача такова - написать компилятор Паскаля на шарпе Я вроде как разобрался, что компилятор обязательно включает...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru