Antlr3:为合格名称构建解析树

问题描述

我找不到最能帮助解决问题的问题/答案。因此,我在这里发布此问题。

我正在尝试为合格名称构建解析树。下面的示例显示一个示例。

例如

  1. foo_boo.aaa.ccc1_c

    enter image description here

在这里我有点分隔的单词。我正在使用antlr3,下面是我的语法。

parse
    :  expr
    ;


list_expr : <I removed the grammar here>
SimpleType : ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
           ;

QualifiedType : SimpleType | SimpleType ('\.' SimpleType)+;


expr : list_expr
    | QualifiedType
    | union_expr;

/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = HIDDEN; } ;

在这里SympleType表示单词的语法。我的要求是为QualifiedType建立语法。上面给出的当前语法无法正常工作(QualifiedType : SimpleType | SimpleType ('\.'SimpleType)+;)。 如何为合格名称(点分隔的单词)编写正确的语法?

解决方法

使class Solution: def reverse(self,x: int): reverse = 0 if x > 0: while x != 0: remainder = x % 10 if reverse > (2147483647/10): return 0 reverse = reverse * 10 + remainder x = int(x / 10) return reverse elif x < 0: x = x * (-1) while x != 0: remainder = x % 10 if reverse > ((2147483648)/10): return 0 reverse = reverse * 10 + remainder x = int(x / 10) reverse = reverse * (-1) return reverse else: return 0 成为解析器规则而不是词法分析器规则:

QualifiedType

此外,qualifiedType : SimpleType ('.' SimpleType)*; 不需要转义:'\.'可以。

编辑

您必须设置the output to AST and apply some tree rewrite rules才能使其正常工作。这是一个快速演示:

'.'

如果现在运行代码:

grammar T;

options {
  output=AST;
}

tokens {
  Root;
  QualifiedName;
}

parse
 : qualifiedType EOF -> ^(Root qualifiedType)
 ;

qualifiedType
 : SimpleType ('.' SimpleType)* -> ^(QualifiedName SimpleType+)
 ;

SimpleType
 : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')*
 ;

您将获得一些DOT output,它对应于以下AST:

enter image description here