【问题标题】:Does logical AND and NOT exists in ANTLR?ANTLR 中是否存在逻辑 AND 和 NOT?
【发布时间】:2011-07-28 19:15:45
【问题描述】:

ANTLR 中没有逻辑吗?我基本上试图否定我拥有的规则,并且想知道它是否可能,还有 AND 逻辑吗?

【问题讨论】:

    标签: antlr grammar antlr3 formal-languages


    【解决方案1】:

    @larsmans 已经提供了答案,我只是想举一个 ANTLR 规则中的法律否定的例子(因为他们经常犯错误)。

    ANTLR 中的否定运算符是~(波浪号)。在词法分析器规则中,~ 否定单个字符:

    NOT_A : ~'A';
    

    匹配除'A' 和:以外的任何字符:

    NOT_LOWER_CASE : ~('a'..'z');
    

    匹配除小写 ASCII 字母以外的任何字符。 lats 的例子也可以写成:

    NOT_LOWER_CASE : ~LOWER_CASE;
    LOWER_CASE : 'a'..'z';
    

    只要你否定一个字符,使用~ 是有效的。这样做是无效

    INVALID : ~('a' | 'aa');
    

    因为你不能否定字符串'aa'

    在解析器规则中,否定不适用于字符,而是用于标记。所以parse 规则:

    parse
      :  ~B
      ;
    
    A : 'a';
    B : 'b';
    C : 'c';
    

    匹配除'b' 之外的任何字符,但匹配除B 标记之外的任何标记。所以它会匹配令牌A(字符'a')或令牌C(字符'c')。

    同样的逻辑适用于. (DOT) 运算符:

    • 在词法分析器规则中,它匹配集合 \u0000..\uFFFF 中的任何字符;
    • 在解析器规则中,它匹配任何标记(任何词法分析器规则)。

    【讨论】:

    • 嗨,你知道写一个规则来匹配简单的字符串而不是特定的关键字吗?我尝试在下面编写类似这样的规则(但它根本不起作用) STRING: ~('\r' | '\n' | '\t' | ' ' | 'keywords')
    • 你的例子,NOT_LOWER_CASE : ~LOWER_CASE; LOWER_CASE : 'a'..'z';在 Antlr4 中不起作用。我得到“集合中当前不支持规则引用 LOWER_CASE”
    • @baruchl 我的答案是针对 ANTLR3,而不是针对 ANTLR4。所以在 v4 中你只需这样做:NOT_LOWER_CASE : ~[a-z]; LOWER_CASE : [a-z];
    【解决方案2】:

    ANTLR 为context-free languages (CFL) 生成解析器。在这种情况下,not 将转换为补码,and 将转换为交集。但是,补和交下的CFLs aren't closed,即not(rule)不一定是CFG规则。

    换句话说,不可能以理智的方式实现notand,因此它们不受支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2018-11-18
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多