Antlr3:为限定名称构建解析树
Antlr3: building parse tree for qualified names
我找不到 question/answer 可以帮助解决我的问题。因此,我在这里发布这个问题。
我正在尝试为限定名称构建解析树。下面的例子显示了一个例子。
例如,
- foo_boo.aaa.ccc1_c
这里我用点分隔词。我正在使用 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)+;
)。 如何为限定名称(点分隔词)编写正确的语法?
使 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' | '_')*
;
如果您现在 运行 代码:
import org.antlr.runtime.*;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.DOTTreeGenerator;
import org.antlr.stringtemplate.StringTemplate;
public class Main {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRStringStream("foo_boo.aaa.ccc1_c"));
TParser parser = new TParser(new CommonTokenStream(lexer));
CommonTree tree = (CommonTree)parser.parse().getTree();
DOTTreeGenerator gen = new DOTTreeGenerator();
StringTemplate st = gen.toDOT(tree);
System.out.println(st);
}
}
你会得到一些DOT output,对应如下AST:
我找不到 question/answer 可以帮助解决我的问题。因此,我在这里发布这个问题。
我正在尝试为限定名称构建解析树。下面的例子显示了一个例子。
例如,
- foo_boo.aaa.ccc1_c
这里我用点分隔词。我正在使用 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)+;
)。 如何为限定名称(点分隔词)编写正确的语法?
使 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' | '_')*
;
如果您现在 运行 代码:
import org.antlr.runtime.*;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.DOTTreeGenerator;
import org.antlr.stringtemplate.StringTemplate;
public class Main {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRStringStream("foo_boo.aaa.ccc1_c"));
TParser parser = new TParser(new CommonTokenStream(lexer));
CommonTree tree = (CommonTree)parser.parse().getTree();
DOTTreeGenerator gen = new DOTTreeGenerator();
StringTemplate st = gen.toDOT(tree);
System.out.println(st);
}
}
你会得到一些DOT output,对应如下AST: