|
Cандальная шляпа
42 / 42 / 36
Регистрация: 12.01.2012
Сообщений: 187
|
||||||
Компилятор. Лексический анализ кода Pascal12.10.2015, 12:56. Показов 5677. Ответов 4
Метки нет (Все метки)
Добрый день. Пишу лексический анализатор для кодов Pascal.
И как вывести переменные которые используются в описание var? Тут есть мыслишка (ниже код), только получается как надо.
Пример кода паскаль
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
|
||||||
| 12.10.2015, 12:56 | |
|
Ответы с готовыми решениями:
4
Написать компилятор на языке C++/C# для программы на PASCAL Компилятор одного кода с маленькими изменениями builder на C# Провести лексический анализ строки и сказать является ли она верным арифметическим выражением |
|
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
|
||
| 12.10.2015, 13:29 | ||
|
Однако, конструкция var плюс имена переменных и их типы - это синтаксическая конструкция. Поэтому нужен синтаксический анализатор тут. Можно почитать книжку Компиляторы. Принципы, технологии и инструментарий. Потом взять Coco/R с таким atg файлом. Немного допилить его и получить нормальный парсер паскаля ![]() С помощью которого извлечь нужную информацию из кода программы.
1
|
||
|
|
||||||
| 12.10.2015, 13:43 | ||||||
|
Doctor Nano,
Автомат (машина состояний, state machine):
Кликните здесь для просмотра всего текста
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 | ||||||
|
А можно проект выложить пожалуйста данного кода ?
0
|
||||||
|
[Bicycle Reinventor]
|
|
| 04.02.2019, 08:23 | |
|
Советую почитать серию статей Руслана Спивака про написание интерпретатора Паскаля в 14 частях. Всё максимально подробно, понятно и интересно.
Жаль только, что серия не закончена, хотя автор обещал вернуться к созданию 15-ой части.
0
|
|
| 04.02.2019, 08:23 | |
|
Помогаю со студенческими работами здесь
5
Объяснение кода - лексический анализатор Лексический анализ выражений. Формы записи выражений Лексический анализ выражений. Формы записи выражений
Компилятор для Pascal на языке C# Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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
На первой гифке отладочные линии отключены, а на второй включены:. . .
|