标签: antlr

ANTLR语法中是否有保留字列表?

我最近创建了一个ANTLR3解析器规则

options : foo bar;
Run Code Online (Sandbox Code Playgroud)

它没有编译,我花了一些时间才发现这options是一个保留字(AntlrWorks表示错误,但不是为什么).ANTLR中是否有保留字列表,是否有命名规则的最佳实践(这可能有助于避免这种情况)?

antlr

4
推荐指数
1
解决办法
1968
查看次数

为什么Rhino对这个javascript不满意?

我已经在一些浏览器中成功地使用我的代码与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)

javascript java antlr rhino

4
推荐指数
1
解决办法
2826
查看次数

在ANTLR中,是否有一个快捷符号表示某些规则集的所有排列的交替?

在ANTLR中,我想定义一个这样的规则:

规则:(abc | acb | bac | bca | cab | cba);

但在我的情况下,我有10个规则而不是3个,我想要置换,因此它变得非常不切实际.有没有办法在ANTLR中表达这一点而不必写出所有的排列?

grammar parsing antlr rules

4
推荐指数
1
解决办法
646
查看次数

需要仪器Javascript:函数调用/ args - 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)

javascript parsing antlr inject

4
推荐指数
1
解决办法
946
查看次数

用gradle编译3.2 Antlr语法

我正在尝试用gradle编译我的antlr语法.我很傻,所以我很难解决问题.

我认为它试图使用2.7 antlr进行编译(因为我看到其他一些人在使用错误的版本时报告类似的错误),因此抛出错误.

我怎么能够:

  1. 显示哪个版本的Antlr gradle正在尝试使用?
  2. 获得gradle正确编译?

这是我的语法:

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支持.

这是另一个版本,包括手动支持Antlr3.

antlr gradle

4
推荐指数
1
解决办法
3477
查看次数

"skip"更改解析器行为

添加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)

如果我注释掉COMMAwithoutSkip规则,我得到这个: …

antlr antlr4

4
推荐指数
1
解决办法
3257
查看次数

从语法构建符号表

我试图通过使用eclipse 从我的语法(使用antlr完成)构建一个符号表.但是我不知道从什么开始.我想我在某处读到你需要antlr生成的解析器和词法分析器才能做到这一点.有人知道一个简单的例子,以便我能理解它是如何工作的吗?

eclipse grammar antlr symbol-table

4
推荐指数
1
解决办法
4389
查看次数

Antlr中的Lexer模式

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)

java antlr antlr4

4
推荐指数
1
解决办法
5703
查看次数

在antlr4中构建AST

我想知道我们是否可以使用Antlr版本4构建AST.我找不到使用antlr4构建它的任何参考.一个SO答案说,使用只生成解析树的antlr4很容易,但我的问题是效率如何呢?

它迫使我们抓取整个解析树而不是抽象语法树,这不是遍历整个树并使用访问者执行任务的有效方式.

antlr abstract-syntax-tree antlr4

4
推荐指数
1
解决办法
3536
查看次数

如何理解为ANTLR语法生成的ATN图?

我在ANTLR语法中有2个简单的词法分析器规则:

fragment Attrs : '.' ARCH; 
fragment ARCH : 'IA32' | 'X64' | 'IPF' | 'EBC' | 'common';
Run Code Online (Sandbox Code Playgroud)

使用ANTLR4.7生成的ATN如下所示:

在此处输入图片说明

我searhed约ATN一定的参考,比如这一个

很漂亮,但我不明白:

  • 节点中的数字和标签是什么意思?
  • 箭头线上的epsion符号是什么意思?
  • 灰色和红色节点是什么意思?

antlr automata state-machine regular-language antlr4

4
推荐指数
1
解决办法
517
查看次数