// 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) 当引用符合语法的文本的解析结果时,术语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变量.然后用户可以将这些变量转换为浮点数.最后,我为用户生成相同的代码,但使用他选择的新变量类型.
我试图定义使用ekmett的库抽象语法类型bound和free.我有一些工作,我可以删除到以下最小的例子:
{-# 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?
如何找到属性是从语法的产生中合成还是继承?
我想因为必须在问题中预定义属性 - 如果它的值取决于子节点或父节点.但有没有办法分析属性是从语法产生继承还是合成.
compiler-construction parsing abstract-syntax-tree context-free-grammar semantic-analysis
我试图在没有任何花哨库(即从头开始)的帮助下在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(我不熟悉这些语言)和使用库感兴趣的部分.
比方说,我有一堆的功能a,b,c,d和e我想看看他们是否直接使用一个循环:
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 …
我正在查看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)
有人可以更深入地了解它到底是做什么的吗?
我希望在 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?
parsing ×3
c ×2
python ×2
rust ×2
antlr ×1
bash ×1
c# ×1
codegen ×1
free-monad ×1
gcc ×1
grammar ×1
haskell ×1
inspect ×1
lex ×1
loops ×1
macros ×1
python-2.7 ×1
python-3.x ×1
swc-compiler ×1
typescript ×1
visitor ×1