Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

unitran

Universal translator to any language based on EBNF (Exteded Backus -Naur Form) description and semantic tags

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

text
# 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