Sign in Join

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

Catalog · How the catalog works
Anything · Lazarus or Delphi
Random projectRandom project

uni_parser

Универсальный синтаксический анализатор на основе расширенной формы Бэкуса-Наура (Universal syntax analizer based on EBNF (Exteded Backus -Naur Form)

View on GitHub

Member rating

No ratings yet.

Sign in to rate this project.

README

text
# uni_parser

Универсальный синтаксический анализатор
на основе расширенной формы Бэкуса-Наура (РБНФ)

Использование:
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) запустить программу uni_parser.
Синтаксический разбор будет произведен по первому правилу файла 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.fpc - окончательная сборка проекта