我希望能够获得给定OCaml程序的AST(例如,我想走AST并生成代码的检测版本或进行某种转换).任何OCaml工具都支持此功能吗?
是否可以将AST转换为CoffeeScript而不是JavaScript?我正在工作的项目基本上需要将所有CoffeeScript转换为AST,分析AST,然后将部分AST转换回CoffeeScript.我知道关于原始代码的转换将是"有损的",但这没关系.
我真的想避免将这些部分编译成JavaScript然后再回到CoffeeScript.
首先,语义规则和抽象语法树规则是一样的吗?
现在,如果我有语言规范,并且我有CFG,那么我该如何构建抽象语法树规则.任何来源都表示赞赏.谢谢.
我想要精确复制groovy脚本的接口,但是将所有方法转发给invokeMethod或methodMissing等方法.
这与我在这里的其他问题有关(但我放弃了"轻松"部分),这解释了为什么我实际上不能使用invokeMethod或ProxyMetaClass - 简而言之,因为我的方法是从java调用而没有groovy的grooviness适用于该调用.
所以我一直试图复制类签名并将调用转发给原始类.
这可能涉及AST转换,但我仍然试图将我的大脑包围在那些,任何使用AST做这样的事情(或任何其他想法)的例子将不胜感激.
我正在寻找将org.eclipse.jdt.core.dom.ITypeBinding实例转换为实例的一般方法org.eclipse.jdt.core.dom.Type.虽然我觉得应该有一些API调用来做到这一点,但我找不到一个.
根据具体类型,似乎有多种方法可以手动执行此操作.
ITypeBinding如果Type没有所有这些特殊情况,是否有任何一般方法可以获得并得到一个?拿a String和返回a Type也是可以接受的.
更新
从目前为止的反应来看,似乎我必须处理所有这些特殊情况.这是第一次尝试这样做.我确信这不是完全正确的,所以请仔细审查:
public static Type typeFromBinding(AST ast, ITypeBinding typeBinding) {
if( ast == null )
throw new NullPointerException("ast is null");
if( typeBinding == null )
throw new NullPointerException("typeBinding is null");
if( typeBinding.isPrimitive() ) {
return ast.newPrimitiveType(
PrimitiveType.toCode(typeBinding.getName()));
}
if( typeBinding.isCapture() ) {
ITypeBinding wildCard = typeBinding.getWildcard();
WildcardType capType = ast.newWildcardType();
ITypeBinding bound = wildCard.getBound();
if( bound != null ) {
capType.setBound(typeFromBinding(ast, bound)),
wildCard.isUpperbound());
}
return capType; …Run Code Online (Sandbox Code Playgroud) 我一直在搜索互联网几天,试图回答我的问题,我终于承认失败了.
我得到了一个语法:
Dig ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Int ::= Dig | Dig Int
Var ::= a | b | ... z | A | B | C | ... | Z
Expr ::= Int | - Expr | + Expr Expr | * Expr Expr | Var | let Var = Expr in Expr
我被告知要使用这种语法解析,评估和打印表达式
,其中运算符* + -具有正常含义
.具体任务是编写函数parse :: String …
我正在编写一个解析器来解析简单的算术公式:它只需要(和限制)来支持数字和变量上的+ - */.例如:
100.50*num*discount
Run Code Online (Sandbox Code Playgroud)
它基本上用于计算产品价格.
这是用python编写的,我想简单地使用python自己的解析器.这个想法首先解析输入AST,然后走在AST,以限制一小部分的AST的节点类型,比如:ast.BinOp,ast.Add,ast.Num,ast.Name等...
目前它运作良好,除了ast中的浮点数不精确.所以我想将ast的ast.Num节点转换成一些节点ast.Call(func=ast.Name(id='Decimal'), ...).但问题是:ast.Num只包含一个n已解析的浮点数字段.在源代码中获取原始数字文字并不容易:如何获取对应于Python AST节点的源代码?
有什么建议吗?
我已经阅读了此链接,但仍不完全了解TraverseDecl和VisitDecl(及其用例)之间有什么区别http://clang.llvm.org/doxygen/classclang_1_1RecursiveASTVisitor.html
编写RecursiveASTVisitor时应重写哪个方法?
我正在使用Menhir解析DSL.我的解析器使用精心设计的嵌套类型集合构建AST.在以后的类型检查和为用户生成的错误报告中的其他传递期间,我想参考它发生的源文件位置.这些不是解析错误,它们在解析完成后生成.
一个天真的解决方案是为所有AST类型配备额外的位置信息,但这将使得与它们一起工作(例如构建或匹配)不必要的笨拙.这样做的既定做法是什么?
我正在努力在Haskell中创建一个AST.我想添加不同的注释,例如类型和位置信息,所以我最终使用了fixplate.但是,我在网上找不到任何例子,我遇到了一些困难.
我按照fixplate的推荐设置了我的AST(有些条纹):
data ProgramF a
= Unary a
Operator
| Number Int
| Let { bindings :: [(Identifier, a)]
, body :: a }
type Program = Mu ProgramF
Run Code Online (Sandbox Code Playgroud)
接下来添加标签我创建了另一种类型,以及一个基于树遍历添加标签的函数.
type LabelProgram = Attr ProgramF PLabel
labelProgram :: Program -> LabelProgram
labelProgram =
annMap (PLabel . show . fst) . (snd . synthAccumL (\i x -> (i + 1, (i, x))) 0)
Run Code Online (Sandbox Code Playgroud)
但是,除此之外,我遇到了一些问题.例如,我正在尝试编写一个对AST进行一些转换的函数.因为它需要一个标签来运行,我已经制作了类型LabelProgram -> Program,但我认为我在做错了.下面是一部分函数的片段(一个更简单的部分):
toANF :: LabelProgram -> Program
toANF (Fix (Ann label (Let {bindings, …Run Code Online (Sandbox Code Playgroud) haskell abstract-syntax-tree recursive-datastructures fixpoint-combinators