Skip to content

Развитие front-end’а #8

@Mazdaywik

Description

@Mazdaywik

Предлагаются следующие шаги для развития front-end’а. Частично они навеяны #7.

  • Псевдокомментарии *$ не должны быть синтаксической ошибкой внутри функций.

  • Выкинуть костыль с (Symbol Word t.SrcPos e.Chars*).

  • Объединить модули Refal5-AST, Refal5-Lexer, Refal5-Parser и Refal5-Tokens.

    Исходя из цели фреймворка (Обдумать построение дерева разбора #7) фронт-энд будет использоваться преимущественно целиком — редко лексер будет использоваться отдельно от парсера. Поэтому для удобства логично их объединить в одном модуле.

    Модули Refal5-AST и Refal5-Tokens нужны Рефалу-05 из-за *$EENUM’ов. При использовании фреймворка вместе с Рефалом-5 в них находятся только две некритичные функции — Builtins и TokName.

    Поэтому имеет смысл не объединять все четыре файла в один, а объединить Refal5-AST и Refal5-Tokens в Refal5-FrontEnd-Defs R5FW-Parser-Defs, а Refal5-Lexer и Refal5-Parser — в Refal5-FrontEnd R5FW-Parser (см. комментарий).

  • Переписать (отрефакторить) сам парсер — вместо имеющегося рекурсивного спуска и двухпроходного алгоритма, использовать «перенос-свёртку», апробированную в Переписать парсер в виде «перенос-свёртка» Refal-05#29 и одиночный проход. Будет ли это точным рефакторингом — не очевидно, поскольку при переписывании сообщения об ошибках могут измениться.

  • Ввести несколько функций для синтаксического и лексического анализа: R5FW-ParseFile, R5FW-ParseText, R5FW-ParseTokens, R5FW-ScanFile, R5FW-ScanText, принимающие имя файла (***File), последовательность строк с начальной позицией (***Text) и список токенов (R5FW-ParseTokens). Функции, работающие со строкой (R5FW-***String), ввести тоже можно, но они будут эквивалентны R5FW-***Text с передачей единственной строки.

    Функции должны возвращать результат в формате

    <R5FW-Parse…> == s.Ok e.AST (e.Messages)
    <R5FW-Scan…> == s.Ok t.Token* (e.Messages)
    
    s.Ok ::= Ok | Fails
    e.Messages ::= (t.Pos s.Severity s.Type e.Info)*
    s.Severity ::= Error | Warning
    
    <R5FW-FormatMessage s.Type e.Info> == s.CHAR+
    

    s.Ok облегчает анализ: не нужно среди e.Messages искать Error, чтобы понять, что были ошибки.

    s.Type может быть, например, Error-UndeclaredFunction, а e.Info для него — именем функции.

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions