标签: antlr

如何匹配字符串,但不区分大小写?

假设我想匹配"啤酒",但不关心区分大小写.

目前我正在定义一个令牌('b'|'B''e'|'E''e'|'E''r'|'R')但我有很多这样的但不是真的想要处理'verilythisisaverylongtokenindeedomyyesitis'.

antlr wiki 似乎暗示它无法完成(在antlr中)...但我只是想知道是否有人有一些聪明的技巧......

antlr antlr3

19
推荐指数
4
解决办法
8181
查看次数

Xtext可以用于解析通用编程语言吗?

我目前正在开发一种基于代理的通用编程语言(它的语法将受到Java的启发,我们也使用这种语言的对象).

自项目开始以来,我们怀疑使用ANTLRXtext的事实.那时我们发现Xtext正在实现ANTLR功能的一个子集.所以我们决定在我们的语言中使用ANLTR,失去了为我们的语言免费提供一个完整的Eclipse编辑器的可能性(这是Xtext提供的一个很好的功能).

然而,据我所知,今年夏天Xtext项目向前迈出了大步.引用链接:

Xtext有什么限制?

Sven:您可以使用Xtext实现几乎任何类型的编程语言或DSL.有一个例外,那就是如果你需要使用所谓的"语义谓词",这是一个相当复杂的事情我不认为值得在这里解释.很少有语言真正需要这个概念.然而,突出的例子是C/C++.我们想在下一个版本中查看该主题.

Xtext文档中也强调了这一点:

什么是Xtext?无论您是想创建一个小的文本域特定语言(DSL),还是想要实现一个完整的通用编程语言.使用Xtext,您可以快速创建自己的语言.此外,如果您已经拥有现有语言但缺乏合适的工具支持,则可以使用Xtext创建复杂的基于Eclipse的开发环境,从而在极短的时间内提供现代Java IDE所知的编辑体验.我们称Xtext为语言开发框架.

如果Xtext已经摆脱了过去的限制,为什么仍然无法为最着名的编程语言(Java,C#等)找到复杂的Xtext语法?

在ANTLR网站上,您可以找到大量这样的语法示例,对于Xtext而言,我能够找到的唯一示例是文档中报告的示例.也许Xtext仍然不成熟,无法用于实现通用编程语言?我有点担心这个...我不会开始在Xtext中重写语法,然后才能认识到它不适合那个.

parsing antlr xtext antlr3

19
推荐指数
1
解决办法
7249
查看次数

ANTLR4:空白处理

我见过许多使用空格处理的ANTLR语法,如下所示:

WS: [ \n\t\r]+ -> skip;
// or
WS: [ \n\t\r]+ -> channel(HIDDEN);
Run Code Online (Sandbox Code Playgroud)

因此将空格分别丢弃发送到隐藏的频道.

用这样的语法:

grammar Not;

start:      expression;
expression: NOT expression
          | (TRUE | FALSE);

NOT:    'not';
TRUE:   'true';
FALSE:  'false';
WS: [ \n\t\r]+ -> skip;
Run Code Online (Sandbox Code Playgroud)

有效输入" 不是真 "或" 非假 ",但也是"非真实 ",这不是理想的结果.将语法更改为:

grammar Not;

start:      expression;

expression: NOT WS+ expression
          | (TRUE | FALSE);

NOT:    'not';

TRUE:   'true';
FALSE:  'false';

WS: [ \n\t\r];
Run Code Online (Sandbox Code Playgroud)

解决了这个问题,但我不想在每个规则中手动处理空格.

一般来说,我希望每个令牌之间都有一个空格,但有一些例外(例如' !true '之间不需要空格).

有一个简单的方法吗?

whitespace parsing antlr parser-generator antlr4

19
推荐指数
1
解决办法
1万
查看次数

在线验证antlr-grammar

有没有人知道是否存在某种类型的antlr-grammars在线测试环境,我可以根据某些输入字符串验证和测试给定的语法......?

很高兴得到任何帮助!

parsing antlr

19
推荐指数
0
解决办法
1267
查看次数

ANTLR中解析器规则和词法分析器规则之间的实际区别?

我理解在理论上分离解析器规则和词法分析器规则背后的理论,但在ANTLR中这两个语句之间的实际差异是什么:

my_rule: ... ;

MY_RULE: ... ;
Run Code Online (Sandbox Code Playgroud)

它们会导致不同的AST树吗?性能不同?潜在的含糊之处?

parsing antlr lexical-analysis

18
推荐指数
2
解决办法
7219
查看次数

XText没有提供ANTLR的哪些功能?

我刚刚遇到了非常好的工具Xtext来创建DSL以及IDE进行编辑.我在网上做了一些搜索,发现人们说它没有提供ANTLR的所有功能.我使用ANTLR作为我的解析器生成器.

我甚至不确定ANTLR的哪些功能我需要为我的语言编写完整的解析器,但ANTLR已经存在了很长时间,并且可能支持比Xtext更多的功能.

任何人都可以举一些不能在Xtext语法中指定的例子吗?

eclipse dsl antlr parser-generator xtext

18
推荐指数
1
解决办法
4819
查看次数

ANTLR:如何解释识别Java代码后缀的语法行为?

一周前,我开始了以下项目:一种识别Java代码后缀的语法.

我使用ANTLRJava(Java.g4)的官方语法作为基线并开始添加一些规则.但是,这些新规则还引入了左递归,我也不得不处理.

经过几天的工作,我得到了以下代码.当我开始测试时,我注意到一些不寻常的东西,我仍然无法解释.当给出输入时{ },解析器告诉我no viable alternative at input '<EOF>',但当我在规则的右侧切换终端的顺序时s2,特别是如果我们将右手侧v2_1 | v2_2 | v2_3 ...改为v2_36 | v2_1 | v2_2 ...(终端v2_36移动到第一个位置),顺序{ }被接受.

我的第一个想法是Antlr没有回溯,因为我注意到在输入{ }时,解析器的第一个版本开始遵循规则v2_3,只是报告没有找到任何东西,并且没有尝试考虑其他选项(这是我的想法,但也许不是真的)这样的确v2_36给出了肯定的答案.

但是,经过一些研究,我发现ANTLR实际上是回溯,但只有在其他一切都失败的情况下.至少对于v3.3来说也是如此(在官方ANTLR文件中阅读),但我想这也是如此v4.现在我有点困惑.在这个项目上花了这么多个小时后,如果我不能让它工作,我会觉得非常糟糕.有人可以提供某种提示吗?非常感谢,谢谢.

编辑

管理将问题隔离到

grammar Java;
@parser::members {String ruleName; }

start : compilationUnitSuf EOF;

compilationUnitSuf
    :   {ruleName = "typeDeclarationSuf"; } s2
    ;

s2: '{' '}' …
Run Code Online (Sandbox Code Playgroud)

java grammar antlr

18
推荐指数
1
解决办法
836
查看次数

解析时ANTLR4相互左递归错误

我有这个ANTLR 4语法:

constantFixedExpresion : term (('+'|'-') term)+;

term : factor (('*'|'//'|'REM')factor)+;

factor : ('+'|'-')*
           ( wholeNumberConstant
           | constantFixedExpresion
           | 'TOFIXED' (stringConstant | bitCodeConstant)      
           | identifier)
         ('FIT'constantFixedExpresion)*;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error(119):LanguageA.g4 :::以下几组规则是相互左递归的[constantFixedExpresion,factor,term]

我尝试了很多方法,但无法修复它.有什么问题,如何解决?

java recursion antlr

18
推荐指数
1
解决办法
7912
查看次数

是否有一个使用antlr4从java源代码创建AST并提取方法,变量和注释的简单示例?

有人可以提供一个详细的例子,说明我如何使用antlr4做到这一点?安装antlr4及其依赖项的说明将受到高度赞赏.

java antlr

17
推荐指数
1
解决办法
3万
查看次数

导入后ANTLR4语法标记识别错误

我正在使用GitHub中的antlr4 解析器语法词法分析器语法来解析Python3中的PHP.

当我直接使用这些语法时,我的PoC代码可以工作:

antlr-test.py

from antlr4 import *
# from PHPParentLexer import PHPParentLexer
# from PHPParentParser import PHPParentParser
# from PHPParentParser import PHPParentListener

from PHPLexer import PHPLexer as PHPParentLexer
from PHPParser import PHPParser as PHPParentParser
from PHPParser import PHPParserListener as PHPParentListener


class PhpGrammarListener(PHPParentListener):
    def enterFunctionInvocation(self, ctx):
        print("enterFunctionInvocation " + ctx.getText())


if __name__ == "__main__":
    scanner_input = FileStream('test.php')
    lexer = PHPParentLexer(scanner_input)
    stream = CommonTokenStream(lexer)
    parser = PHPParentParser(stream)
    tree = parser.htmlDocument()
    walker = ParseTreeWalker()
    printer = PhpGrammarListener()
    walker.walk(printer, tree) …
Run Code Online (Sandbox Code Playgroud)

python parsing antlr antlr4

17
推荐指数
1
解决办法
1435
查看次数