标签: abstract-syntax-tree

使用ANTLR构建自己的C#编译器:编译单元

// Create a scanner that reads from the input stream passed to us
 CSLexer lexer = new CSLexer(new ANTLRFileStream(f));
tokens.TokenSource = lexer;

// Create a parser that reads from the scanner
CSParser parser = new CSParser(tokens);

// start parsing at the compilationUnit rule
CSParser.compilation_unit_return x = parser.compilation_unit();
object ast = x.Tree;
Run Code Online (Sandbox Code Playgroud)

我怎么能用compilation_unit_return类型的x来提取它的根,它的类,它的方法等?我必须提取其适配器吗?我怎么做?请注意,compilation_unit_return在我的CSParser中定义(由ANTLR自动生成):

public class compilation_unit_return : ParserRuleReturnScope
    {
        private object tree;
        override public object Tree
        {
            get { return tree; }
            set { tree = (object) value; }
        }
    }; …
Run Code Online (Sandbox Code Playgroud)

c# compiler-construction antlr visitor abstract-syntax-tree

9
推荐指数
2
解决办法
3994
查看次数

术语解析树和派生树之间的任何差异?

当引用符合语法的文本的解析结果时,术语AST(抽象语法树),解析树和派生树由不同的人围绕.假设我们正在谈论解析计算机语言,他们的差异是否足够小,我们可以互换使用这些术语?如果没有,我们如何正确使用这些条款?

grammar parsing lex abstract-syntax-tree

9
推荐指数
2
解决办法
6085
查看次数

从C代码构建AST

如何从gcc C代码构建AST(抽象语法树)以进行一些修改,比如将一些int变量转换为float,然后再将代码重新生成(生成)到C语法.

实际上,目前,我真正需要的唯一功能是从包含几行的ac程序中提取变量及其类型的表...我认为有一个简单的解析器就是这样做的.

我有一些变量,如:

int  var_bss ;           
float var_f_bss;            
int var_data = 4;        
float var_f_data = 5;  
Run Code Online (Sandbox Code Playgroud)

功能:

int Foo(){          
   some local variables;            
}    
Run Code Online (Sandbox Code Playgroud)

代码位于单个c文件中.

我想向最终用户介绍所有变量,让他选择特定内存段中的源类型,例如.data中的int变量.然后用户可以将这些变量转换为浮点数.最后,我为用户生成相同的代码,但使用他选择的新变量类型.

c gcc abstract-syntax-tree code-translation

9
推荐指数
2
解决办法
6156
查看次数

如何使用Python 3.x ast模块解析Python 2.x?

我最近编写了一个Sublime Text 3插件,它解析Python代码并从中发出一些统计信息.

没有什么太复杂,除了我注意到Sublime Text 3使用Python 3.x,显然该ast模块也希望看到Python 3.x代码.我查看了该ast模块的文档,但找不到允许我指定版本的任何内容.

显然,这在解析完全有效的Python 2.7代码时会导致问题.

有没有办法指定或以某种方式检测/猜测Python版本?或者让解析器更灵活?

python parsing abstract-syntax-tree python-2.7 python-3.x

9
推荐指数
1
解决办法
1003
查看次数

语法树:free monad + Bound.Scope

我试图定义使用ekmett的库抽象语法类型boundfree.我有一些工作,我可以删除到以下最小的例子:

{-# LANGUAGE DeriveFunctor #-}

import Bound
import Control.Monad.Free

type Id = String

data TermF f ? =
    AppF ? ?
  | BindF Id (Scope () f ?)
  deriving Functor

newtype Term' ? = T {unT :: Free (TermF Term) ?}
type Term = Free (TermF Term')
Run Code Online (Sandbox Code Playgroud)

最后两行是,呃,不是我所希望的.它们使得PITA实际上可以利用注释(或其他)的开放递归.

是否有更好的方法将这两个库一起使用,和/或我应该放弃尝试制作Term一个免费的monad?

haskell abstract-syntax-tree free-monad

9
推荐指数
1
解决办法
175
查看次数

合成与继承属性

如何找到属性是从语法的产生中合成还是继承?

我想因为必须在问题中预定义属性 - 如果它的值取决于子节点或父节点.但有没有办法分析属性是从语法产生继承还是合成.

compiler-construction parsing abstract-syntax-tree context-free-grammar semantic-analysis

9
推荐指数
1
解决办法
2万
查看次数

在C中用bash创建一个AST

我试图在没有任何花哨库(即从头开始)的帮助下在C中构建一个迷你Bash解释器.我必须管理简单的运算符,如'<','|','<<','>>','>'.
我被告知要构建输入的AST以便于执行过程.问题是,我不明白我应该如何构建一个.

到目前为止,我制作了一个链接列表,我的输入变成了令牌,但无法想出如何制作AST:

typedef struct       s_token
{
    enum e_TokenType type;
    char             *lexeme;
    struct s_token   *prev;
    struct s_token   *next;
}                    t_token;
Run Code Online (Sandbox Code Playgroud)

你能解释一下如何把它变成一个功能AST吗?例如,使用此输入:

cat << EOF > file | wc -c | tr -d " " > file2
Run Code Online (Sandbox Code Playgroud)

我想AST会是这样的:

我已经看到其他帖子描述了如何但他们在JS/Python(我不熟悉这些语言)和使用库感兴趣的部分.

c bash abstract-syntax-tree

9
推荐指数
1
解决办法
405
查看次数

如何找出函数的(源代码)是否包含循环?

比方说,我有一堆的功能a,b,c,de我想看看他们是否直接使用一个循环:

def a():
    for i in range(3):
        print(i**2)

def b():
    i = 0
    while i < 3:
        print(i**2)
        i += 1

def c():
    print("\n".join([str(i**2) for i in range(3)]))

def d():
    print("\n".join(["0", "1", "4"]))

def e():
    "for"
Run Code Online (Sandbox Code Playgroud)

我想写一个函数,uses_loop所以我可以期望这些断言传递:

assert uses_loop(a) == True
assert uses_loop(b) == True
assert uses_loop(c) == False
assert uses_loop(d) == False
assert uses_loop(e) == False
Run Code Online (Sandbox Code Playgroud)

(我希望uses_loop(c)返回,False因为c使用列表解析而不是循环.)

我不能修改a,b …

python loops static-analysis abstract-syntax-tree inspect

9
推荐指数
1
解决办法
296
查看次数

__rust_force_expr 到底是做什么的?

我正在查看vec![]Rust 中的宏实现,并注意到它使用了__rust_force_expr!宏。这是后者的实现:

/// Force AST node to an expression to improve diagnostics in pattern position.
#[doc(hidden)]
#[macro_export]
#[unstable(feature = "liballoc_internals", issue = "none", reason = "implementation detail")]
macro_rules! __rust_force_expr {
    ($e:expr) => {
        $e
    };
}
Run Code Online (Sandbox Code Playgroud)

有人可以更深入地了解它到底是做什么的吗?

macros abstract-syntax-tree rust

9
推荐指数
1
解决办法
804
查看次数

如何使用 SWC 生成 TypeScript 代码

我希望在 Rust 中使用SWC来生成一些 TypeScript 代码。不幸的是,发射器似乎只能打印 JavaScript。这是正确的,还是有办法打印 TypeScript?例如,假设我们正在制作以下 AST。

use swc_atoms::js_word;
use swc_common::{BytePos, Span, SyntaxContext};
use swc_ecmascript;
use swc_ecmascript::ast;

fn main() {
    let program = ast::Program::Module(ast::Module {
        body: vec![ast::ModuleItem::ModuleDecl(ast::ModuleDecl::ExportDecl(
            ast::ExportDecl {
                decl: ast::Decl::TsTypeAlias(ast::TsTypeAliasDecl {
                    span: Span::default(),
                    declare: false,
                    id: ast::Ident::new(js_word!(""), Span::default()),
                    type_params: None,
                    type_ann: Box::new(ast::TsType::TsKeywordType(ast::TsKeywordType {
                        span: Span::default(),
                        kind: ast::TsKeywordTypeKind::TsStringKeyword,
                    })),
                }),
                span: Span::default(),
            },
        ))],
        shebang: None,
        span: Span::new(BytePos(1), BytePos(1), SyntaxContext::empty()),
    });
}
Run Code Online (Sandbox Code Playgroud)

如何获取与programAST 对应的 TypeScript?

abstract-syntax-tree rust codegen typescript swc-compiler

9
推荐指数
1
解决办法
1917
查看次数