首页 文章

野牛/ yacc语法消歧

提问于
浏览
1

我遵循野牛语法(作为更复杂的语法的一部分): ``

expression:
    IDENTIFIER
    | CONST
    | LAMBDA match_block
;
match_block:
    pattern '=' expression
    | match_block '|' pattern '=' expression
;
pattern:
    IDENTIFIER
    | CONST
;

描述了包含带有模式匹配的标识符,常量和lambda函数的表达式,如下所示:
lambda 0 = 1 | 1 = 2 | x = x 问题是1次移位/减少由嵌套匹配引起的歧义引起的冲突,如下例所示: lambda 0 = 1 | x = lambda 1 = 2 | y = 4 规则是匹配块与最近函数相关,如上例中的缩进所示 .

我的问题是 - 如何重写这个语法来消除这种歧义(不使用%left%right yacc指令)?

1 回答

  • 2

    如果你总是希望 | 绑定到最接近的 LAMBDA ,那基本上只意味着你只能在 match_block 的LAST | 子句中拥有 LAMBDA

    non_lambda_expression:
        IDENTIFIER
        | CONST
    ;
    expression:
        non_lambda_expression
        | LAMBDA match_block
    ;
    non_lambda_match_block:
        pattern '=' non_lambda_expression
        | non_lambda_match_block '|' pattern '=' non_lambda_expression
    ;
    match_block:
        pattern '=' expression
        | non_lambda_match_block '|' pattern '=' expression
    ;
    pattern:
        IDENTIFIER
        | CONST
    ;
    

    基本上,您将 expressionmatch_block 拆分为两个版本 - 一个允许lambda,另一个不允许 - 并在每个点使用适当的版本以避免歧义 .

相关问题