将ANTLR与Python结合使用,代码从Java迁移而来
我有以下语法,我想解析输入以获得相关的AST。使用ANTLR for Java,一切都很简单。由于ANTLR4,在语法文件中,您不必指定选项`output=AST;获取ASTs信息 你好.g将ANTLR与Python结合使用,代码从Java迁移而来,antlr,abstract-syntax-tree,parse-tree,Antlr,Abstract Syntax Tree,Parse Tree,我有以下语法,我想解析输入以获得相关的AST。使用ANTLR for Java,一切都很简单。由于ANTLR4,在语法文件中,您不必指定选项`output=AST;获取ASTs信息 你好.g grammar Hello; // Define a grammar called Hello stat : expr NEWLINE | ID '=' expr NEWLINE | NEWLINE | expr ;
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 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()
Antlr4目前没有Python目标,Antlr3也不支持自动生成解析树来生成您正在查看的输出
您可能可以使用ANTLR 3中的AST创建功能来生成树,但它的形式(当然不是简单的)与ANTLR 4不同。Python现在有一个ANTLR 4运行时(),但ToString树是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