2014-02-21 48 views
1

我有以下語法,我想解析輸入以獲得關聯的AST。 ANTLR for Java一切都很簡單。由於ANTLR4,在語法文件中,您不必指定選項`output = AST;獲取AST信息。與Python一起使用ANTLR與代碼從Java遷移

Hello.g

grammar Hello; // Define a grammar called Hello 
stat : expr NEWLINE  
    | ID '=' expr NEWLINE 
    | NEWLINE 
     | expr 
    ; 

expr: atom (op atom)* ; 

op : '+'|'-' ; 

atom : INT | ID; 

ID : [a-zA-Z]+ ; 

INT : [0-9]+ ; 

NEWLINE : '\r' ? '\n' ; 

WS : [ \t\r\n]+ -> skip ; 

Test.java

import org.antlr.v4.runtime.*; 
import org.antlr.v4.runtime.tree.*; 
import java.io.*; 
import lib.HelloLexer; 
import lib.HelloParser; 
public class Test { 
    public static void main(String[] args) throws Exception { 
     ANTLRInputStream input = new ANTLRInputStream("5 + 3"); 
     // create a lexer that feeds off of input CharStream 
     HelloLexer lexer = new HelloLexer(input); 
     // create a buffer of tokens pulled from the lexer 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     // create a parser that feeds off the tokens buffer 
     HelloParser parser = new HelloParser(tokens); 
     ParseTree tree = parser.expr(); // begin parsing at init rule 
     //System.out(tree.toStringTree(parser)); // print LISP-style tree 
     System.out.println(tree.toStringTree(parser)); 
    } 
} 

的輸出將是:

(expr (atom 5) (op +) (atom 3)) 

但是,請你告訴我如何獲得與Python實現相同的結果?目前,我正在使用ANTLR 3.1.3 Runtime for Python。下面的代碼只返回 「(+ 5 3)」

Test.py

import sys 
import antlr3 
import antlr3.tree 
from antlr3.tree import Tree 
from HelloLexer import * 
from HelloParser import * 

char_stream = antlr3.ANTLRStringStream('5 + 3') 
lexer = ExprLexer(char_stream) 
tokens = antlr3.CommonTokenStream(lexer) 
parser = ExprParser(tokens) 
r = parser.stat() 

print r.tree.toStringTree() 

回答

1

有一個antlr4運行現在爲Python(https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Python+Target),但toStringTree是Python運行時的類方法。你可以這樣稱呼它來得到lisp風格的解析樹,包括字符串化的標記:

from antlr4 import * 
from antlr4.tree.Trees import Trees 
# import your parser & lexer here 

# setup your lexer, stream, parser and tree like normal 

print(Trees.toStringTree(tree, None, parser)) 

# the None is an optional rule names list 
1

目前沒有的Python目標ANTLR 4,和ANTLR 3不支持自動生成解析樹的產生你正在看的輸出。

您可能能夠使用AST創建功能在ANTLR 3,產生一棵樹,但它不會有相同的形式(當然不是簡單)的ANTLR 4.

+0

嗯,真可惜!無論如何謝謝你的信息。 :) – anhldbk