Skip to content
This repository has been archived by the owner on Feb 5, 2023. It is now read-only.
/ student-pc Public archive

The simple translator from Pascal-like language to TAC

License

Notifications You must be signed in to change notification settings

comeillfoo/student-pc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

student-pc (student-pascal-compiler)

Задание. Вариант 7.

Правила в форме Бэкуса-Наура.

<Программа>             ::= <Объявление переменных> <Описание вычислений>

<Описание вычислений>   ::= "Begin" <Список операторов> "End" "."

<Объявление переменных> ::= "Var" <Список переменных>

<Список переменных>     ::= <Идент> ";"
| <Идент> "," <Список переменных>
| <Идент> ";" <Список переменных>

<Список операторов>     ::= <Оператор>
| <Оператор> <Список операторов>

<Оператор>              ::= <Присваивание>
| <Сложный оператор>
| <Составной оператор> 

<Составной оператор>    ::= Begin <Список операторов> End

<Присваивание>          ::= <Идент> "=" <Выражение> ";"

<Выражение>             ::= <Ун. оп.> <Подвыражение>
| <Подвыражение>

<Подвыражение>          ::= "(" <Выражение> ")"
| <Операнд>
| <Подвыражение> <Бин. оп.> <Подвыражение>

<Ун. оп.>                ::= "-" | "not"

<Бин. оп.>               ::= "-" | "+" | "*" | "/" | "**" | ">" | "<" | "=="

<Операнд>               ::= <Идент> | <Const>

<Сложный оператор>      ::= "IF" "(" <Выражение> ")" <Оператор>
| "IF" "(" <Выражение> ")" <Оператор> "ELSE" <Оператор>
| <Оператор цикла>

<Оператор цикла>        ::= "REPEAT" <Список операторов> "UNTIL" <Выражение>

<Идент>                 ::= <Буква> <Идент> | <Буква>

<Const>                 ::= <Цифра> <Const> | <Цифра>

Комментарии.

Для вариантов 1, 4, 7, 12 комментарий в стиле С++ однострочный
//   ----- Комментарий ------

1. Написание лексера и реализация правил грамматики

1.1. Лексер

Статус: написан и генерирует токены.

1.2. Реализация правил грамматики

Список реализованных правил

Статус Название из варианта Название в spc.scan.y
✔️ <Программа> program
✔️ <Описание вычислений> description_of_calculations
✔️ <Объявление переменных> variables_declaration
✔️ <Список переменных> variables_list
✔️ <Список операторов> statements_list
✔️ <Оператор> statement
✔️ <Составной оператор> composed_statement
✔️ <Присваивание> assignment
✔️ <Выражение> expression
✔️ <Подвыражение> subexpression
✔️ <Ун. оп.> unop
✔️ <Бин. оп.> binop
✔️ <Операнд> operand
✔️ <Сложный оператор> branch_statement
✔️ <Оператор цикла> loop_statement
✔️ <Идент> ident
✔️ <Const> const

2. Инструкция к использованию.

1. Компиляция:

make all

2. Список коман:

./spc --help
SYNOPSYS
    spc [-v] [-f <input file>] [-o <output file>]
DESCRIPTION
    -h, --help
        shows this help message and exits
    -f, --file
        specifies the input file path, default: stdin
    -o, --out
        specifies the output file path, default: a.out
    -a, --ast
        if option presents then ast tree prints in stderr
    -v, --verbose
        enables extra output

3. Вывод ast

./spc --ast < programs/fact5.pas
<program:0x5567574baf00[ child: 0x5567574babd0 ]>
    <statements-list:0x5567574babd0[ current: 0x5567574b95b0, next: 0x5567574badf0 ]>
        <expression:0x5567574b95b0[ left: 0x5567574b94a0, oper: =, right: 0x5567574b9390 ]>
            <identifier:0x5567574b94a0[ name: n ]>
            <constant:0x5567574b9390[ value: 5 ]>
        <expression:0x5567574b9900[ left: 0x5567574b97f0, oper: =, right: 0x5567574b96e0 ]>
            <identifier:0x5567574b97f0[ name: result ]>
            <constant:0x5567574b96e0[ value: 1 ]>
        <repeat-until:0x5567574baac0[ test: 0x5567574ba9b0, body: 0x5567574ba550 ]>
            <statements-list:0x5567574ba550[ current: 0x5567574b9eb0, next: 0x5567574ba660 ]>
                <expression:0x5567574b9eb0[ left: 0x5567574b9da0, oper: =, right: 0x5567574b9c90 ]>
                    <identifier:0x5567574b9da0[ name: result ]>
                    <expression:0x5567574b9c90[ left: 0x5567574b9a50, oper: *, right: 0x5567574b9b80 ]>
                        <identifier:0x5567574b9a50[ name: result ]>
                        <identifier:0x5567574b9b80[ name: n ]>
            <expression:0x5567574ba440[ left: 0x5567574ba330, oper: =, right: 0x5567574ba220 ]>
                <identifier:0x5567574ba330[ name: n ]>
                <expression:0x5567574ba220[ left: 0x5567574ba000, oper: -, right: 0x5567574ba110 ]>
                    <identifier:0x5567574ba000[ name: n ]>
                    <constant:0x5567574ba110[ value: 1 ]>
            <expression:0x5567574ba9b0[ left: 0x5567574ba790, oper: ==, right: 0x5567574ba8a0 ]>
                <identifier:0x5567574ba790[ name: n ]>
                <constant:0x5567574ba8a0[ value: 1 ]>

4. TAC

./spc -o b.out < programs/fact8.pas
Код будет находиться в файле b.out

About

The simple translator from Pascal-like language to TAC

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published