<Программа> ::= <Объявление переменных> <Описание вычислений>
<Описание вычислений> ::= "Begin" <Список операторов> "End" "."
<Объявление переменных> ::= "Var" <Список переменных>
<Список переменных> ::= <Идент> ";"
| <Идент> "," <Список переменных>
| <Идент> ";" <Список переменных>
<Список операторов> ::= <Оператор>
| <Оператор> <Список операторов>
<Оператор> ::= <Присваивание>
| <Сложный оператор>
| <Составной оператор>
<Составной оператор> ::= Begin <Список операторов> End
<Присваивание> ::= <Идент> "=" <Выражение> ";"
<Выражение> ::= <Ун. оп.> <Подвыражение>
| <Подвыражение>
<Подвыражение> ::= "(" <Выражение> ")"
| <Операнд>
| <Подвыражение> <Бин. оп.> <Подвыражение>
<Ун. оп.> ::= "-" | "not"
<Бин. оп.> ::= "-" | "+" | "*" | "/" | "**" | ">" | "<" | "=="
<Операнд> ::= <Идент> | <Const>
<Сложный оператор> ::= "IF" "(" <Выражение> ")" <Оператор>
| "IF" "(" <Выражение> ")" <Оператор> "ELSE" <Оператор>
| <Оператор цикла>
<Оператор цикла> ::= "REPEAT" <Список операторов> "UNTIL" <Выражение>
<Идент> ::= <Буква> <Идент> | <Буква>
<Const> ::= <Цифра> <Const> | <Цифра>
Для вариантов 1, 4, 7, 12 комментарий в стиле С++ однострочный
// ----- Комментарий ------
Статус: написан и генерирует токены.
Статус | Название из варианта | Название в 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 |
make all
./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
./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 ]>
./spc -o b.out < programs/fact8.pas
Код будет находиться в файле b.out