Набор библиотек для Рефала-5

Библиотека R5FW-Parser

Токены (лексические домены) Рефала-5

t.Token ::= (s.TokType t.Pos e.TokValue)

s.TokType ~ e.TokValue ::=
  TkName ~ s.CHAR*
  TkCompound ~ s.CHAR*
  TkMacroDigit ~ s.NUMBER
  TkChar ~ s.CHAR
  TkVariable ~ s.VarType e.VarName
  TkOpenBracket, TkCloseBracket, TkCloseCall,
  TkOpenBlock, TkCloseBlock ~ пусто
  TkOpenCall ~ s.CHAR* -- имя функции
  TkComma, TkColon, TkAssign, TkSemicolon ~ пусто
  TkExtern, TkEntry ~ пусто
  TkSpecComment ~ char*
  TkEOF ~ пусто
  TkError ~ s.CHAR* -- сообщение об ошибке в лексике
s.VarType ::= 's' | 't' | 'e'

Каждый токен содержит тег токена, позицию в исходном тексте и необязательный атрибут токена.

Токены:

Токен Смысл
TkOpenBracket (
TkCloseBracket )
TkCloseCall >
TkOpenBlock {
TkCloseBlock }
TkComma ,
TkColon :
TkAssign =
TkSemicolon ;

Абстратное синтаксическое дерево Рефала-5

t.Refal5-AST ::= t.Unit*
t.Unit ::= t.Function | t.Extern | t.SpecialComment
t.Extern ::= (Extern (t.SrcPos e.Name)*)
t.SpecialComment ::= (SpecialComment t.SrcPos e.Text)

t.Function ::= (Function t.SrcPos (e.Name) s.Scope t.Sentence+)
s.Scope ::= Entry | Local
t.Sentence ::= (t.Pattern (Condition t.Result t.Pattern)* e.SentenceTail)
e.SentenceTail ::= RETURN t.Result | CALL-BLOCK t.Result t.Sentence*

t.Pattern, t.Result ::= (t.Term*)
t.Term ::=
    (Symbol Word e.Chars*)
  | (Symbol Number s.Number)
  | (Symbol Char s.Char)
  | (Variable t.SrcPos s.VarType e.Index)
  | (Brackets t.Term*)
  | (Call t.SrcPos (e.Function) t.Terms*)
s.VarType ::= 's' | 't' | 'e'

Лексический анализатор для Рефала-5

Возвращает строковое (человекочитаемое) представление данного лексического домена.

<TokName s.TokType> == s.CHAR*

Лексический анализатор для Рефала-5, для указанного файла формирует последовательность токенов.

<Scan e.SourceFile> == t.Token*
t.Pos ::= (s.Line s.Col e.FileName)

Возвращает последовательность токенов для данного файла.

Позиция в исходном тексте, формируемая лексическим анализатором, содержит номер колонки, строки и имя файла.

<ScanString-FromPos t.InitPos e.String> == e.Tokens
t.InitPos ::= t.Pos

Разбивает строку на токены, начальной позицией принимается t.InitPos.

Синтаксический анализатор для Рефала-5

<Builtins> == (e.FunctionName)*

e.FunctionName ::= s.CHAR+

Функция возвращает имена встроенных функций, включая сокращённые имена для арифметических операций (+, -, /, %, *, ?).

<Parse e.Tokens>
  == Success e.Refal5-AST
  == Fails t.Error*

t.Error ::= (t.SrcPos e.Message)

Функция Parse принимает последовательность токенов и возвращает абстрактное синтаксическое дерево.

Если файл содержит корректный текст на Рефале, функция возвращает Success и синтаксическое дерево. Иначе функция возвращает Fails и список ошибок. Таким образом, возвращаемое дерево всегда соответствует корректной программе.

К позициям токенов парсер относится как к чёрному ящику, внутрь t.SrcPos не заглядывает.