我正在为C做一个静态分析器.我已经使用ANTLR完成了词法分析器和解析器,其中生成了Java代码.
ANTLR会自动为我们构建AST options {output=AST;}吗?或者我必须自己制作树?如果是,那么如何吐出AST上的节点?
我目前认为AST上的节点将用于制作SSA,然后进行数据流分析以制作静态分析器.我在正确的道路上吗?
有没有办法在JVM上运行普通的c代码?
不通过JNI连接,运行,就像你可以通过JRuby运行ruby代码,或通过Rhino运行javascript.
如果没有当前的解决方案,您会建议我应该做什么?
显然,我想尽可能多地使用部分解决方案来实现它.
ANTLR似乎是一个很好的起点,拥有完整的"ANSI C"语法实现......
我应该使用ANTLR生成的代码在JVM上构建一个"玩具"VM吗?
我在IntelliJ中创建了简单的语法文件,但没有看到Antlr插件的任何影响.当我在ANTLR预览中打开文件时,它说
start rule: <select from navigator or grammar>
Run Code Online (Sandbox Code Playgroud)
什么是开始规则?如何从导航器中选择它?如何从语法中选择它?
我一直在查看ANTLR v3文档(以及我对"The Definitive ANTLR reference"的可靠副本),我似乎无法找到一种在字符串文字中实现转义序列的简洁方法(我目前正在使用Java目标).我希望能够做到这样的事情:
fragment
ESCAPE_SEQUENCE
: '\\' '\'' { setText("'"); }
;
STRING
: '\'' (ESCAPE_SEQUENCE | ~('\'' | '\\'))* '\''
{
// strip the quotes from the resulting token
setText(getText().substring(1, getText().length() - 1));
}
;
Run Code Online (Sandbox Code Playgroud)
例如,我希望输入标记" 'Foo\'s House'"成为字符串" Foo's House".
不幸的是,片段中的setText(...)调用ESCAPE_SEQUENCE设置了整个STRING令牌的文本,这显然不是我想要的.
有没有办法实现这个语法而不添加一个方法来返回结果字符串并手动替换转义序列(例如,setText(escapeString(getText()))在STRING规则中的某些内容)?
是否有人知道在C#中使用ANTLR生成的AST的教程?我能找到的最接近的是这个,但它并不是非常有用.
我的目标是根据我正在使用的特定于域的语言遍历我正在生成的树,并使用树来输出生成的C#代码.
基于Java的教程也很有帮助 - 任何提供如何遍历ANTLR AST的明确示例的东西.
.NET有一个很好的解析器生成器(想想lex/yacc或antlr)吗?任何拥有不会吓唬律师的执照的人?很多LGPL,但我正在研究嵌入式组件,有些组织对我采用LGPL依赖感到不舒服.
我听说奥斯陆可能提供此功能,但我不确定它是构建时依赖还是运行时依赖.任何人都可以澄清奥斯陆会提供什么吗?
更新
我真正想要的是一个解析器生成器,它只是一个构建时依赖项.看起来ANTLR有一个运行时组件.
我查看了如何配置IntelliJ IDEA的antlr4插件.但我找不到任何东西.我只能安装插件.如果我为空项目手动添加.g4文件,我会在右键菜单中获得"生成ANTLR识别器"选项.就这些.我认为这是非常有前途的插件.任何人都可以告诉/指导我如何继续插件?
谢谢
我正在尝试实现python,如缩进依赖语法.
来源示例:
ABC QWE
CDE EFG
EFG CDE
ABC
QWE ZXC
Run Code Online (Sandbox Code Playgroud)
正如我所看到的,我需要的是实现两个令牌INDENT和DEDENT,所以我可以这样写:
grammar mygrammar;
text: (ID | block)+;
block: INDENT (ID|block)+ DEDENT;
INDENT: ????;
DEDENT: ????;
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来实现这个使用ANTLR?
(如果可能的话,我更愿意使用标准的ANTLR词法分析器.)
我是一个完整的ANTLR4新手,所以请原谅我的无知.我遇到了这个演示文稿,其中定义了一个非常简单的算术表达式语法.看起来像:
grammar Expressions;
start : expr ;
expr : left=expr op=('*'|'/') right=expr #opExpr
| left=expr op=('+'|'-') right=expr #opExpr
| atom=INT #atomExpr
;
INT : ('0'..'9')+ ;
WS : [ \t\r\n]+ -> skip ;
Run Code Online (Sandbox Code Playgroud)
这很好,因为它会生成一个非常简单的二叉树,可以使用访问者模式遍历,如幻灯片中所述,例如,这里是访问以下内容的函数expr:
public Integer visitOpExpr(OpExprContext ctx) {
int left = visit(ctx.left);
int right = visit(ctx.right);
String op = ctx.op.getText();
switch (op.charAt(0)) {
case '*': return left * right;
case '/': return left / right;
case '+': return left + right;
case '-': return left …Run Code Online (Sandbox Code Playgroud) 有没有人知道是否存在某种类型的antlr-grammars在线测试环境,我可以根据某些输入字符串验证和测试给定的语法......?
很高兴得到任何帮助!