Как обрабатывать сбои semanti c в TatSu при правильном разборе? - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь создать анализатор TatSu для языка, содержащего C -подобные выражения. У меня есть следующие грамматические правила для выражений:

identifier =
    /[a-zA-Z][A-Za-z0-9_]*/
    ;

expression =
    or_expr
    ;

or_expr =
    '||'<{and_expr}+
    ;

and_expr =
    '&&'<{bitwise_or_expr}+
    ;

bitwise_or_expr =
    '|'<{bitwise_xor_expr}+
    ;

bitwise_xor_expr =
    '^'<{bitwise_and_expr}+
    ;

bitwise_and_expr =
    '&'<{equality_expr}+
    ;

equality_expr =
    ('==' | '!=')<{comparison_expr}+
    ;

comparison_expr =
    ('<' | '<=' | '>' | '>=')<{bitshift_expr}+
    ;

bitshift_expr =
    ('<<' | '>>')<{additive_expr}+
    ;

additive_expr =
    ('+' | '-')<{multiplicative_expr}+
    ;

multiplicative_expr =
    ('*' | '/' | '%')<{unary_expr}+
    ;

unary_expr =
    '+' ~ atom
    | '-' ~ atom
    | '~' ~ atom
    | '!' ~ atom
    | atom
    ;

atom =
    literal
    | helper_call
    | parenthesized
    | var_or_param
    ;

literal =
    value:float type:`float`
    | value:integer type:`int`
    | value:char type:`char`
    | value:string type:`string`
    | value:bool type:`int`
    | value:null type:`null`
    ;

helper_call =
    function:identifier '(' ~ params:expression_list ')'
    ;

var_or_param =
    identifier
    ;

parenthesized =
    '(' ~ @:expression ')'
    ;

У меня возникли проблемы с правилом atom. При анализе следующего (expression является частью между = и ;):

lastTime = ts + interval;

я получил это исключение:

tatsu.exceptions.FailedToken: (27:41) expecting '(' :
                lastTime = ts + interval;
                                        ^
helper_call
atom
unary_expr
multiplicative_expr
...

Не удалось выполнить попытку чтобы оно соответствовало правилу helper_call, когда правило var_or_param должно было соответствовать. Оказывается, причиной была ошибочная FailedSemantics, вызванная семантами c действий для var_or_param. Как только я исправил это, синтаксический анализ сработал, как и ожидалось.

Возникает вопрос: если FailedSemantics влияет на логи синтаксического анализа c, как правильно уведомить пользователя о появлении semanti * 1025? * ошибка, но логика разбора c в остальном верна и не должна пытаться делать разные выборы или правила? Например, несовпадение типов или использование переменной до объявления? (В идеале, таким образом, чтобы номер строки, где произошла ошибка, все равно отображался.)

...