【问题标题】:Preferring one alternative更喜欢一种选择
【发布时间】:2016-09-13 21:31:32
【问题描述】:

我的 ANTLR v4 语法摘录如下所示:

expression:
    | expression BINARY_OPERATOR expression
    | unaryExpression
    | nularExpression
;
unaryExpression:
    ID expression
;

nularExpression:
    ID
    | NUMBER
    | STRING
;

我的目标是在不知道所有必要关键字的情况下匹配语言,因此我只是将关键字作为 ID 进行匹配。
但是,有些二元运算符在关键字的两边都带有参数(例如关键字),因此它们需要“特殊处理”。如您所见,我已经在expression 规则中包含了这种“特殊处理”。

现在的实际问题在于,其中一些二元运算符可以用作一元运算符(=普通关键字),这意味着不必指定左参数。
上面的语法不能解决这种情况,因为每次我尝试实现它时,我最终都会将每个二元运算符都用作一元运算符。

示例:
假设count 是一个二元运算符。
可能的语法是<arg1> count <arg2>count <arg>

我实现上述案例的所有尝试最终都将myArgument count otherArgument 分组为(myArgument (count (otherArgument) ) ) 而不是(myArgument) count (otherArgument)


我的大脑告诉我,这个问题的解决方案是告诉解析器始终为二元运算符获取两个参数,如果失败,它应该尝试将二元运算符作为一元运算符来使用。
有谁知道如何做到这一点?

【问题讨论】:

    标签: parsing antlr4 operator-precedence


    【解决方案1】:

    这样的事情怎么样:

    lower_precedence_expression
     : ID higher_precedence_expression
     | higher_precedence_expression
     ;
    
    higher_precedence_expression
     : higher_precedence_expression ID lower_precedence_expression
     | ID
     | NUMBER
     | STRING
     ;
    

    ?

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 2021-09-03
      • 1970-01-01
      • 2013-12-30
      • 2013-04-15
      相关资源
      最近更新 更多