假设我想匹配"啤酒",但不关心区分大小写.
目前我正在定义一个令牌('b'|'B''e'|'E''e'|'E''r'|'R')但我有很多这样的但不是真的想要处理'verilythisisaverylongtokenindeedomyyesitis'.
antlr wiki 似乎暗示它无法完成(在antlr中)...但我只是想知道是否有人有一些聪明的技巧......
我目前正在开发一种基于代理的通用编程语言(它的语法将受到Java的启发,我们也使用这种语言的对象).
自项目开始以来,我们怀疑使用ANTLR或Xtext的事实.那时我们发现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中重写语法,然后才能认识到它不适合那个.
我见过许多使用空格处理的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 '之间不需要空格).
有一个简单的方法吗?
有没有人知道是否存在某种类型的antlr-grammars在线测试环境,我可以根据某些输入字符串验证和测试给定的语法......?
很高兴得到任何帮助!
我理解在理论上分离解析器规则和词法分析器规则背后的理论,但在ANTLR中这两个语句之间的实际差异是什么:
my_rule: ... ;
MY_RULE: ... ;
Run Code Online (Sandbox Code Playgroud)
它们会导致不同的AST树吗?性能不同?潜在的含糊之处?
我刚刚遇到了非常好的工具Xtext来创建DSL以及IDE进行编辑.我在网上做了一些搜索,发现人们说它没有提供ANTLR的所有功能.我使用ANTLR作为我的解析器生成器.
我甚至不确定ANTLR的哪些功能我需要为我的语言编写完整的解析器,但ANTLR已经存在了很长时间,并且可能支持比Xtext更多的功能.
任何人都可以举一些不能在Xtext语法中指定的例子吗?
一周前,我开始了以下项目:一种识别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) 我有这个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]
我尝试了很多方法,但无法修复它.有什么问题,如何解决?
有人可以提供一个详细的例子,说明我如何使用antlr4做到这一点?安装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)