Catalog · How the catalog works
unitran
Universal translator to any language based on EBNF (Exteded Backus -Naur Form) description and semantic tags
- ★ 5 on GitHub
Anyone may press Interesting, signed in or not. It helps others find this project.
README
# translator_pl0
Универсальный синтаксический анализатор
на основе расширенной формы Бэкуса-Наура (РБНФ)
и транслятор с интерпретатором виртуальной машины ПЛ/0
Использование:
1) в файл lang.rbnf поместить описание языка в расширенной форме Бэкуса-Наура
описание должно кончаться ключевым словом "end_of_file"
<goal> ::= symbol = <expression>
<expression> ::= <term> {, <term>}
<term> ::= <factor> { <factor> }
<factor> ::= <symbol> | [<term>] | [<term> !]
[<term>] - многократное вхождение <term>, возможно 0 раз
[ !] - условное (0 или 1 раз) вхождение <term>
Пример (Н.Вирт):
A= x, (B).
B= A C.
C= [+A].
end_of_file
В данном случае
x, (, ), + -терминальные символы
A, B, C - нетерминальные символы
[+A] - повторение 0 или большее число раз "+A" (для A будет подстановка)
, - выбор альтернативы (x или "(B)", где для B будет подстановка )
допустимы метаслова (регистр важен): ANY, EMPTY, EXCLUDE_ON, EXCLUDE_OFF
NUMBER - любое целое неотрицательное число без знака
IDENT - любой идентификатор, т.е. последовательность, начинающаяся с буквы или "_"
OPER - символ любой операции, например, +, -, <, >, =, :=, >=, <= и т.п.
NULL - нераспознанные символы.
ANY - любой идентификатор (ident)
ONE_ANY_CHAR - один любой символ (т.е. идентификатор длиной 1 символ)
EMPTY - "пустой" символ, т.е. парсер пропускает обрабатываемый блок
EXCLUDE_ON - включить режим инверсной логики
EXCLUDE_OFF - выключить режим инверсной логики
например, name= EXCLUDE_ON reserved_words EXCLUDE_OFF.
reserved_words= if, then, var.
после прохода по правилу name результат будет "истина",
если анализируемый идентификатор не является if, then, var.
допустимы однострочные комментарии
все строки, начинающиеся на # или // игнорируются
есть "дублирование" символа слэшем,
например \" будет ", \R будет R, \пробел будет пробел, \\ будет \
вообще говоря, предназначено для экранирования \. \, \[, \=, \], \#, \| и т.д.
прямой ввод символа по его 16-ному коду ASCII предваряется #
например, #35 будет "5", #0D или #D будет возврат каретки.
сам символ # можно экранировать \#
2) в файл test_programm.xxx поместить текст для грамматического разбора
описание должно кончаться ключевым словом "end_of_file"
Пример (Н.Вирт):
(x+x)
end_of_file
3) запустить программу pl0_machine.
Синтаксический разбор файла test_program.xxx
будет произведен по первому правилу файла lang.rbnf
В резульате появится синтаксический разбор и результат
CORRECT - правильно
INCORRECT - есть ошибка.
Останов происходит на месте несоответствия правил входному потоку.
Компиляция:
fpc token_utils.pas - соберется модуль token_utils.ppu базовые определения
fpc sym_scanner.pas - соберется модуль sym_scanner.ppu выделения отдельных токенов из входного файла
fpc rbnf_scanner.pas - соберется модуль rbnf_scanner.ppu проверки синтаксиса lang.rbnf
fpc rbnf_gen.pas - соберется модуль rbnf_gen.ppu построения синтаксического дерева
fpc uni_parser.pas - сборка модуля проверки синтаксиса программы test_program.xxx
fpc pl0_machine.pas - сборка модуля интерпретатора байт-кода ПЛ/0
