首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当解析正确时,如何处理TatSu中的语义故障?

当解析正确时,如何处理TatSu中的语义故障?
EN

Stack Overflow用户
提问于 2020-04-17 03:19:08
回答 1查看 132关注 0票数 1

我正在尝试为一种包含类C表达式的语言创建一个TatSu解析器。我有以下表达式的语法规则:

代码语言:javascript
复制
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=;之间的部分):

代码语言:javascript
复制
lastTime = ts + interval;

我得到了一个例外:

代码语言:javascript
复制
tatsu.exceptions.FailedToken: (27:41) expecting '(' :
                lastTime = ts + interval;
                                        ^
helper_call
atom
unary_expr
multiplicative_expr
...

它尝试使其符合helper_call规则的尝试失败了,而var_or_param规则应该匹配得很好。事实证明,原因是var_or_param的语义操作引发了一个错误的FailedSemantics。一旦我解决了这个问题,解析就会像预期的那样工作。

这就提出了一个问题:如果FailedSemantics影响解析逻辑,那么当存在语义错误时提醒用户的正确方式是什么,但是解析逻辑在其他方面是正确的,不应该尝试不同的选择或规则?例如,类型不匹配或声明前的变量使用?(理想情况下,仍然可以显示发生错误的行号。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-25 07:52:50

FailedSemantic%s确实会影响解析。它在解析逻辑中被转换为FailedParse

如果解析应该停止,那么继续使用FailedSemantics

在其他情况下,这取决于您。

TatSu的设计使得大多数语义检查都是在解析成功后通过遍历或其他方式完成的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61258345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档