我正在为学校项目创建一个简单的编程语言.我正在使用ANTLR 4从我的语法生成词法分析器和解析器.到目前为止,我一直在使用ANTLRs监听器模式来应用编程语言的实际功能.
现在我想实现if/else语句,但是我不确定在使用监听器模式时这些实际上是可以实现的,因为ANTLR决定在使用监听器时遍历解析树的顺序,我想是if /的实现else语句将要求在解析树周围跳转,具体取决于语句中的条件是否满足.
任何人都可以告诉我是否可以使用ANTLR实现if/else语句,或者我是否必须自己实现访问者模式?另外,任何人都可以给出一个非常简单的实现语句的例子吗?
Visual Studio 2013中的ASP.NET(Web窗体)项目模板包含多个包.我试图找出哪些是必要的(可能需要为此创建一个单独的问题).http://blogs.msdn.com/b/webdev/archive/2013/10/16/asp-net-features-in-new-project-templates-in-visual-studio-2013.aspx上的帖子解释了其中一些的目的,但我无法弄清楚Antlr需要什么.有人可以澄清吗?
使用Java 7语法https://github.com/antlr/grammars-v4/blob/master/java7/Java7.g4我想找到具有特定名称的方法,然后打印出该方法.我看到methodDeclaration我匹配时可以使用规则.所以我继承Java7BaseListener并覆盖这个监听器方法:
@Override public void enterMethodDeclaration(Java7Parser.MethodDeclarationContext ctx) { }
Run Code Online (Sandbox Code Playgroud)
如何获取原始文本? ctx.getText()给了我一个字符串,所有的空白都被删除了.我想要评论和原始格式.
目标
我正在开发一个为Coldfusion CFscript创建Varscoper的项目.基本上,这意味着检查源代码文件以确保开发人员正确地使用var他们的变量.
在使用ANTLR V4几天后,我有一个语法,在GUI视图中生成一个非常好的解析树.现在,使用该树,我需要一种方法来以编程方式在节点上爬行和寻找变量声明,并确保如果它们在函数内部,则它们具有适当的范围.如果可能的话,我宁愿不在语法文件中这样做,因为这需要将语言的定义与此特定任务混合.
我试过的
我最近的尝试是使用ParserRuleContext并尝试通过它的children通过getPayload().在检查了类之后,getPayLoad()我会有一个ParserRuleContext对象或一个Token对象.不幸的是,使用它我永远无法找到获取特定节点的实际规则类型的方法,只有它包含文本.每个节点的规则类型都是必需的,因为该文本节点是否是被忽略的右手表达式,变量赋值或函数声明都很重要.
问题
这是我的示例java代码:
Cfscript.java
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.Trees;
public class Cfscript {
public static void main(String[] args) throws Exception {
ANTLRInputStream input = new ANTLRFileStream(args[0]);
CfscriptLexer lexer = new CfscriptLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
CfscriptParser parser = new CfscriptParser(tokens);
parser.setBuildParseTree(true);
ParserRuleContext tree = parser.component();
tree.inspect(parser); // show in gui
/*
Recursively go though tree finding function declarations and …Run Code Online (Sandbox Code Playgroud) 在决定从v3切换到v4后,我需要帮助我的ANTLR 4语法.我对ANTLR不太熟悉,所以如果我的问题很愚蠢,我真的很抱歉;)
在v3中,我使用以下代码来检测Java样式的注释:
COMMENT
: '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
| '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
;
Run Code Online (Sandbox Code Playgroud)
在v4中,没有特定于规则的选项.操作(移至隐藏频道)也无效.
有人可以给我一个提示如何在ANTLR v4中做到这一点吗?
我已经开始使用ANTLR,并注意到它的词法分析规则相当变幻无常.一个非常令人沮丧的例子如下:
grammar output;
test: FILEPATH NEWLINE TITLE ;
FILEPATH: ('A'..'Z'|'a'..'z'|'0'..'9'|':'|'\\'|'/'|' '|'-'|'_'|'.')+ ;
NEWLINE: '\r'? '\n' ;
TITLE: ('A'..'Z'|'a'..'z'|' ')+ ;
Run Code Online (Sandbox Code Playgroud)
这个语法不匹配:
c:\ test.txt
x
奇怪的是,如果我改变TITLE为TITLE: 'x' ;它仍然失败,这次给出一个错误消息说"不匹配的输入'x'期待'x'"这是非常混乱.更奇怪的是,如果我替换的使用TITLE在test与FILEPATH整个事情的作品(虽然FILEPATH将匹配多于我期待相符所以总的来说这是对我并没有有效的解决方案).
我非常困惑为什么ANTLR会给出如此极其奇怪的错误,然后突然出现问题时,没有明显的原因.
我打算用C#编写一个C#3.0编译器.我在哪里可以获得解析器生成的语法?
优选地,可以在没有修改的情况下与ANTLR v3一起使用.
任何人都可以指导我在ASP.Net,C#项目中使用ANTLR dll的目的.
我刚刚注意到某个项目中引用了antlr.runtime,Antlr3.Runtime,Antlr3.Utlility程序集.
如果可以引用一些真实世界的示例或任何网页链接将是有用的将是伟大的.
我正在用ANTLR和ANTLRWorks 2创建我的第一个语法.我主要完成了语法本身(它识别用所描述的语言编写的代码并构建正确的解析树),但我还没有开始做任何事情.
令我担心的是,解析器规则中每个第一次出现的令牌都带有下划线,并带有"解析器规则中的隐式令牌定义".
例如,在此规则中,'var'具有波形:
variableDeclaration: 'var' IDENTIFIER ('=' expression)?;
Run Code Online (Sandbox Code Playgroud)
它看起来如何:

奇怪的是,ANTLR本身似乎并不介意这些规则(在进行测试装备测试时,我在解析器生成器输出中看不到任何这些警告,只是在我的机器上安装了不正确的Java版本),所以这只是ANTLRWorks的抱怨.
是担心还是应该忽略这些警告?我应该在词法分析器规则中明确声明所有令牌吗?官方圣经"定义ANTLR参考"中的大多数exaples 似乎完全按照我编写代码的方式完成.