的語法分析器文法
protocol.g如何操縱樹語法
grammar protocol;
options {
language = Java;
output = AST;
ASTLabelType=CommonTree;
}
tokens{
TRANSITIONS;
PAIR;
}
@header {
package com.javadude.antlr3.x.tutorial;
}
@lexer::header {
package com.javadude.antlr3.x.tutorial;
}
parse
: transitions EOF!
{
CommonTree root = $transitions.tree;
int count = root.getChildCount();
Tree child1 = root.getChild(0);
Tree child2 = root.getChild(1);
Tree child3 = root.getChild(2);
Tree child4 = root.getChild(3);
System.out.println("root=" + root.getToken().getText() + " has " + count + " child nodes:");
System.out.println(" - child1=" + child1.toStringTree());
System.out.println(" - child2=" + child2.toStringTree());
System.out.println(" - child3=" + child3.toStringTree());
System.out.println(" - child4=" + child4.toStringTree());
}
;
transitions
: 'transitions' '=' INT pair+ ';' -> ^(TRANSITIONS INT pair+)
;
pair
: '(' INT ',' INT ')' -> ^(PAIR INT INT)
;
INT
: ('0'..'9')+;
WHITESPACE
: ('\t' | ' ' | '\r' | '\n' | '\u000C')+ {$channel = HIDDEN;};
樹語法
protocolWalker.g
tree grammar protocolWalker;
options {
language = Java;
tokenVocab = protocol;
ASTLabelType = CommonTree;
}
@header {
package com.javadude.antlr3.x.tutorial;
}
transitions
: ^(TRANSITIONS INT pair+)
{
System.out.println("transitions=" + $INT.text);
}
;
pair
: ^(PAIR a=INT b=INT)
{
System.out.println("pair=" + $a.text + ", " + $b.text);
}
;
JAVA TEST RIG
Protocoltest.java
package com.javadude.antlr3.x.tutorial;
import org.antlr.runtime.*;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.CommonTreeNodeStream;
public class Protocoltest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
//create input stream from standard input
ANTLRInputStream input = new ANTLRInputStream(System.in);
//create a lexer attached to that input stream
protocolLexer lexer = new protocolLexer(input);
//create a stream of tokens pulled from the lexer
CommonTokenStream tokens = new CommonTokenStream(lexer);
//create a parser attached to teh token stream
protocolParser parser = new protocolParser(tokens);
//invoke the program rule in get return value
protocolParser.parse_return r =parser.parse();
CommonTree t = (CommonTree)r.getTree();
//output the extracted tree to the console
System.out.println("\nAST is: " + t.toStringTree());
//walk resulting tree; create treenode stream first
CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
//AST nodes have payloads that point into token stream
nodes.setTokenStream(tokens);
//create a tree walker attached to the nodes stream
protocolWalker walker = new protocolWalker(nodes);
//invoke the start symbol, rule parse
walker.transitions();
}
}
INPUT
transitions = 3(5,0) (5,1) (5,2);
OUTPUT
root=TRANSITIONS has 4 child nodes:
- child1=3
- child2=(PAIR 5 0)
- child3=(PAIR 5 1)
- child4=(PAIR 5 2)
AST is: (TRANSITIONS 3 (PAIR 5 0) (PAIR 5 1) (PAIR 5 2))
pair=5, 0
pair=5, 1
pair=5, 2
transitions=3
問題
你可以在上面看到,在語法分析器(protocol.g)我可以存儲的過渡root作爲child1,的child2,child3和child4的所有孩子。另外,我已經打印了這些。 在樹語法中,如何存儲這些文件並對這些文件執行操作? 謝謝
你打算做什麼樣的操作? – user1201210
我將實例化Java類(將創建Java對象) 例如,樹中的第一個數字將確定將創建多少個對象,然後,PAIR 5 0將創建一個具有2個參數(5,0)的對象, PAIR 5 1將創建帶有2個參數(5,1)的第2個對象,並且PAIR 5 2將創建帶有2個參數的第3個對象(5,2) –