有谁知道R是否存在现有的ANTLR或IRONY语法?
非常感谢.
在什么是ANTLR3中的"语义谓词"?Bart Kiers非常清楚地概述了Antlr3中的不同语义谓词.
太糟糕了,Antlr4中的语法/语义似乎有所改变,所以这不会编译:
end_of_statement
: ';'
| EOF
| {input.LT(1).getType() == RBRACE}? =>
;
RBRACE
: '}'
;
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何处理end_of_statement的第三种情况:如果下一个标记是'}'但不消耗它,则接受.
我试图解析(在Java中)维基百科上的Wikiimedia标记.有许多现有的包用于此任务,但我没有发现任何特别适合我的需求.我使用过的最好的软件包是Mathclipse Bliki解析器,它在大多数页面上都做得不错.
但是,此解析器不完整,无法解析某些页面或无法正确解析其他页面.可悲的是,代码相当混乱,因此修复此解析引擎中的问题非常耗时且容易出错.
在尝试找到一个更好的解析引擎时,我已经研究过使用基于EBNF的解析器来完成这项任务(特别是ANTLR).经过一些尝试后,似乎这种方法并不特别适合这项任务,因为维基媒体标记相对宽松,因此不能轻易地融入结构化语法.
我对ANTLR和类似解析器的经验非常有限,因此可能是我的经验不足导致问题,而不是这样的解析器天生就不适合这项任务.任何对这些话题有更多经验的人都可以在这里说点吗?
@Stobor:我已经提到我已经查看了各种解析引擎,包括谷歌查询返回的引擎.到目前为止我发现的最好的是Bliki引擎.问题是修复这些解析器的问题变得非常繁琐,因为它们本质上都是条件和正则表达式的长链,导致意大利面条代码.我正在寻找更类似于EBNF解析方法的东西,因为该方法更清晰,更简洁,因此更容易理解和发展.我已经看过你发布的mediawiki链接,似乎证实了我怀疑开箱即用的EBNF不适合这个任务.因此,我正在寻找一个像EBNF一样清晰易懂的解析引擎,但也能够处理wiki标记的混乱语法.
我已经开始学习ANTLR并拥有2007年的书"The Definitive ANTLR Reference"和ANTLRWorks(一种用于创建语法的交互式工具).而且,作为那种人,我从第3章开始.("快速游览不耐烦").
这是一个相当痛苦的过程,特别是因为一些错误是相当难以理解的(例如ANTLR:"缺少对规则范围的属性访问"问题,这对我来说意味着"你有错误").另外,我有一些非常简单的语法(仅限3-4个制作)和简单的输入(2行),在运行时会出现"OutOfMemory"错误.
ANTLR网站很有用,但有点零散,一些SO用户已经评论(/sf/ask/19493631/)本书和教程期望高入门级别.因此,我一直不愿意接近ANTLR讨论列表.
以后我们开始掌握它.拥有可以轻柔扩展的简单可靠的示例将是有用的.这当然值得掌握,因为我们根据ANTLR改造了很多我们的想法.
一个问题是ANTLR V3与V2有显着的变化.SO(以及ANTLR页面)上的一个答案是指不再可用的V2语法.
一些关于SO的ANTLR问题给了我很多帮助,但找到它们有点特别.所以我想知道SO用户如何帮助减少学习过程中的痛苦.(如果您参考参考书,那么指向特定页面会很有用).
编辑.@duffymo和@JamesAnderson已经确认ANTLR很难 - 主要是因为解析器很难.(FWIW我已经通过LEX/YACC等,毫无疑问,ANTLR更强大,更容易使用.)我认为有可能避免结垢的区域仍然是有用的,例如:
而且更多这些将是有用的.
我正在将基于C#的编程语言编译器从手动词法分析器/解析器迁移到Antlr.
Antlr一直给我带来严重的头痛,因为它通常大部分都有效,但是有些小部件没有,而且难以解决.
我发现我的大部分头痛都是由Antlr的词法分析器部分引起的,而不是解析器引起的.然后我注意到parser grammar X;并意识到也许我可以手动编写lexer,然后是Antlr生成的解析器.
所以我正在寻找关于这个主题的更多文档.我想自定义ITokenStream可以工作,但似乎几乎没有关于这个主题的在线文档...
有没有人有一个完整的实现(可能是github或googlecode)来使用ANTLR语法文件和Java源代码来分析Java源代码.例如,我想简单地计算变量,方法等的数量.
还使用了最新版本的ANTLR.
我有以下片段的定义:
fragment CHAR :'a'..'z'|'A'..'Z'|'\n'|'\t'|'\\'|EOF;
Run Code Online (Sandbox Code Playgroud)
现在我必须为字符串定义词法分析器规则.我做了以下事情:
STRING : '"'(CHAR)*'"'
Run Code Online (Sandbox Code Playgroud)
但是在字符串中我希望匹配除新行'\n'以外的所有字符.有什么想法我能做到吗?
我试图将ant ANTLR3语法转换为ANTLR4语法,以便将它与antlr4-python2-runtime一起使用.该语法是C/C++模糊解析器.
在转换它(基本上删除树操作符和语义/语法谓词)之后,我使用以下方法生成了Python2文件:
java -jar antlr4.5-complete.jar -Dlanguage=Python2 CPPGrammar.g4
并且生成的代码没有任何错误,所以我在我的python项目中导入它(我使用PyCharm)进行一些测试:
import sys, time
from antlr4 import *
from parser.CPPGrammarLexer import CPPGrammarLexer
from parser.CPPGrammarParser import CPPGrammarParser
currenttimemillis = lambda: int(round(time.time() * 1000))
def is_string(object):
return isinstance(object,str)
def parsecommandstringline(argv):
if(2!=len(argv)):
raise IndexError("Invalid args size.")
if(is_string(argv[1])):
return True
else:
raise TypeError("Argument must be str type.")
def doparsing(argv):
if parsecommandstringline(argv):
print("Arguments: OK - {0}".format(argv[1]))
input = FileStream(argv[1])
lexer = CPPGrammarLexer(input)
stream = CommonTokenStream(lexer)
parser = CPPGrammarParser(stream)
print("*** Parser: START ***")
start = …Run Code Online (Sandbox Code Playgroud) 我已经创建了新的Gradle项目
apply plugin: 'antlr'
Run Code Online (Sandbox Code Playgroud)
和
dependencies {
antlr "org.antlr:antlr4:4.5.3"
Run Code Online (Sandbox Code Playgroud)
到build.gradle.
创建src/main/antlr/test.g4具有以下内容的文件
grammar test;
r : 'hello' ID;
ID : [a-z]+ ;
WS : [ \t\r\n]+ -> skip ;
Run Code Online (Sandbox Code Playgroud)
但它不起作用.没有生成java源文件(并且没有发生错误).
我错过了什么?
项目在这里:https://github.com/dims12/AntlrGradlePluginTest2
UPDATE
我发现我的样本实际上是有效的,但它把代码放到\build\generated-src了我没想到的地方:羞耻: