我最近创建了一个ANTLR3解析器规则
options : foo bar;
Run Code Online (Sandbox Code Playgroud)
它没有编译,我花了一些时间才发现这options是一个保留字(AntlrWorks表示错误,但不是为什么).ANTLR中是否有保留字列表,是否有命名规则的最佳实践(这可能有助于避免这种情况)?
我已经在一些浏览器中成功地使用我的代码与ANTLR javascript目标中的javascript库,但现在我想在服务器上使用Rhino,我遇到了一些麻烦.我有一些简单的java代码引用了Rhino 1.7R2版本的js-14.jar文件.
Context context = Context.enter();
Scriptable scope = context.initStandardObjects();
context.evaluateReader(scope, new FileReader("C:\\antlr3-all.js"), "antlr", 1, null);
Run Code Online (Sandbox Code Playgroud)
这失败EcmaError的消息是:
TypeError: Cannot call property namespace in object [JavaPackage org.antlr].
It is not a function, it is "object". (antlr#259)
Run Code Online (Sandbox Code Playgroud)
它所指的javascript行是:
org.antlr.namespace("org.antlr.runtime.tree");
Run Code Online (Sandbox Code Playgroud)
这org.antlr.namespace在文件的早期声明为函数,所以我不确定该怎么想.我也没有看到"命名空间"是javascript或Rhino中的保留字.
这是第org.antlr.namespace56行的声明:
org.antlr.namespace = function() {
var a=arguments, o=null, i, j, d;
for (i=0; i<a.length; i=i+1) {
d=a[i].split(".");
o=org.antlr.global;
// ANTLR is implied, so it is ignored if it is included
for (j=0; j<d.length; …Run Code Online (Sandbox Code Playgroud) 在ANTLR中,我想定义一个这样的规则:
规则:(abc | acb | bac | bca | cab | cba);
但在我的情况下,我有10个规则而不是3个,我想要置换,因此它变得非常不切实际.有没有办法在ANTLR中表达这一点而不必写出所有的排列?
我需要加载Javascript并自动检测它:具体来说,我想记录对函数的每次调用,并提供调用函数的参数列表.
我用Python做了一个半生不熟的方法:使用're'来匹配'function'关键字 - 但它真的很原始(不处理注释等等).
我不是ANTRL的专家(离它很远):但是我可以轻松利用已经构建的Javascript Parser来执行此操作吗?(我们可以'挂钩'标准java来动态创建我需要的代码吗?)
BTW:实际的日志记录将(可能)用log4javascript完成; 但我也可能只是使用'警报' - 难以让代码注入工作....
所以,例如,我需要转向:
function foo(bar) {
...
}
Run Code Online (Sandbox Code Playgroud)
成:
function foo(bar) {
alert("<scriptname.js>: foo was called with arguments: [bar="+bar+"]");
...
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试用gradle编译我的antlr语法.我很傻,所以我很难解决问题.
我认为它试图使用2.7 antlr进行编译(因为我看到其他一些人在使用错误的版本时报告类似的错误),因此抛出错误.
我怎么能够:
这是我的语法:
grammar Test;
options {
language = Java;
}
rule: ;
Run Code Online (Sandbox Code Playgroud)
这是我的gradle脚本:
apply plugin: 'java'
apply plugin: 'antlr'
repositories {
mavenCentral()
}
dependencies {
antlr 'org.antlr:antlr:3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
Run Code Online (Sandbox Code Playgroud)
这是尝试编译的输出:
$ gradle compileJava
:generateGrammarSource
/home/admin/workspace/BuildTools/src/main/antlr/Test.g:1:1: unexpected token: grammar
:compileJava UP-TO-DATE
BUILD SUCCESSFUL
Total time: 2.458 secs
Run Code Online (Sandbox Code Playgroud)
编辑:
似乎还没有直接在gradle中支持Antlr3.
有一个拉动请求,可以在这里讨论为gradle 添加antlr3支持.
添加skip到规则不符合我的预期.这是一对由逗号和空格分隔的标记的语法.我制作了一个用逗号标记的版本,另一个版本skip没有:
grammar Commas;
COMMA: ', ';
COMMASKIP: ', ' -> skip;
DATA: ~[, \n]+;
withoutSkip: data COMMA data '\n';
withSkip: data COMMASKIP data '\n';
data: DATA;
Run Code Online (Sandbox Code Playgroud)
测试规则没有skip按预期工作:
$ echo 'a, b' | grun Commas withoutSkip -tree
(withoutSkip (data a) , (data b) \n)
Run Code Online (Sandbox Code Playgroud)
随着skip给我一个错误:
$ echo 'a, b' | grun Commas withSkip -tree
line 1:1 mismatched input ', ' expecting COMMASKIP
(withSkip (data a) , b \n)
Run Code Online (Sandbox Code Playgroud)
如果我注释掉COMMA和withoutSkip规则,我得到这个: …
我试图通过使用eclipse 从我的语法(使用antlr完成)构建一个符号表.但是我不知道从什么开始.我想我在某处读到你需要antlr生成的解析器和词法分析器才能做到这一点.有人知道一个简单的例子,以便我能理解它是如何工作的吗?
all:我正在尝试编写一个antlr解析器来解析一些文本,其格式如下:
RP NUCLEOTIDE SEQUENCE [GENOMIC DNA],
RP PROTEIN SEQUENCE OF 1-22; 2-17;
RP 240-256; 318-339 AND 381-390, AND CHARACTERIZATION.
Run Code Online (Sandbox Code Playgroud)
基本上所有行都有一个'RP '指示文本行的内容,最后一行应以a "."结尾表示此类行的结尾.文本也可以是任何东西.我最终需要的是文本.
我为此编写了一个Antlr语法:
grammar RefLine;
rp_line: RP_HEADER RP_TEXT;
RP_HEADER : 'RP ' -> pushMode(RP_FREE_TEXT_MODE);
mode RP_FREE_TEXT_MODE;
RP_HEADER_SKIP: '\nRP ' -> skip;
RP_TEXT: .+;
DOT_NEWLINE: '.\n' -> popMode;
Run Code Online (Sandbox Code Playgroud)
这里的想法是当看到第一个RP_HEADER时,它变为RP_FREE_TEXT_MODE,从而跳过行之间的任何RP_HEADER.当看到DOT_NEWLINE时,返回主模式.
但是,这个语法不能用Antlr 4.1编译,产生错误:
[ERROR] Message{errorType=MODE_NOT_IN_LEXER, args=[RP_FREE_TEXT_MODE, org.antlr.v4.tool.Grammar@5c0662], e=null, fileName='RefLine.g4', line=7, charPosition=5}
[WARNING] Message{errorType=IMPLICIT_TOKEN_DEFINITION, args=[RP_TEXT], e=null, fileName='RefLine.g4', line=3, charPosition=19}
Run Code Online (Sandbox Code Playgroud)
我不太明白为什么会产生错误.任何人都可以解释在Antlr中使用词法模式的正确方法吗?此外,TOKEN是否在解析器规则不可用的模式中定义?
编辑:
正如@auselen建议的那样,我将lexer语法放在一个单独的文件RefLineLex.g4中:
lexer grammar RefLineLex;
RP_HEADER : 'RP ' -> …Run Code Online (Sandbox Code Playgroud) 我想知道我们是否可以使用Antlr版本4构建AST.我找不到使用antlr4构建它的任何参考.一个SO答案说,使用只生成解析树的antlr4很容易,但我的问题是效率如何呢?
它迫使我们抓取整个解析树而不是抽象语法树,这不是遍历整个树并使用访问者执行任务的有效方式.
我在ANTLR语法中有2个简单的词法分析器规则:
fragment Attrs : '.' ARCH;
fragment ARCH : 'IA32' | 'X64' | 'IPF' | 'EBC' | 'common';
Run Code Online (Sandbox Code Playgroud)
使用ANTLR4.7生成的ATN如下所示:
我searhed约ATN一定的参考,比如这一个。
很漂亮,但我不明白: