我试图解析(在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更强大,更容易使用.)我认为有可能避免结垢的区域仍然是有用的,例如:
而且更多这些将是有用的.
我正在使用ANTLR指定包含不超过254个字符的行的文件格式(不包括行结尾).如何在语法中对此进行编码,但不做:
line : CHAR? CHAR? CHAR? CHAR? ... (254 times)
Run Code Online (Sandbox Code Playgroud) 我一直在使用ANTLR为Java目标生成标记语言的解析器+树语法,它可以正常工作.现在我试图让JavaScript中的目标在我的Web浏览器中使用它.
但是,我无法找到有关如何执行此操作的任何好文档.我正在使用带有ANTLR IDE的eclipse,当我将语言指定为JavaScript时,我会收到以下错误.
此行有多个标记
(10):内部错误:组JavaScript不满足接口ANTLRCore:这些模板上的参数不匹配[treeParser(语法,名称,范围,标记,tokenNames,globalAction,规则,numRules,bitsets,labelType,ASTLabelType,superClass,members,filterMode) )]
(10):内部错误:java.util.NoSuchElementException:没有这样的属性:模板上下文中的filterMode [treeParser]
如果有人可以帮我解决这个问题,或者指出一些我可以通过ANTLR阅读有关JavaScript目标的材料,那就太棒了.
谢谢
我在Internet上找不到关于LL(*)解析器的任何完整描述,例如ANTLR.
我想知道LL(k)解析器和LL(*)之间的区别是什么,以及为什么它们不能支持left-recusrive语法,尽管它们具有灵活性.
我正在将基于C#的编程语言编译器从手动词法分析器/解析器迁移到Antlr.
Antlr一直给我带来严重的头痛,因为它通常大部分都有效,但是有些小部件没有,而且难以解决.
我发现我的大部分头痛都是由Antlr的词法分析器部分引起的,而不是解析器引起的.然后我注意到parser grammar X;并意识到也许我可以手动编写lexer,然后是Antlr生成的解析器.
所以我正在寻找关于这个主题的更多文档.我想自定义ITokenStream可以工作,但似乎几乎没有关于这个主题的在线文档...
我正在使用ANTLR来创建一种新的通用编程语言,我对此非常满意.
由于我想提供好的工具来简化用我的语言编写的程序的开发,我开始考虑通过适当的Eclipse插件实现该语言的编辑器.
是否有任何工具/项目允许您拥有一个完全成熟的编辑器(具有语法突出显示,代码完成等).我知道Xtext允许你自动执行此操作,ANTLR怎么样?
我已经看到这封邮件到ANTLR邮件列表,但它没有答案
有没有人有一个完整的实现(可能是github或googlecode)来使用ANTLR语法文件和Java源代码来分析Java源代码.例如,我想简单地计算变量,方法等的数量.
还使用了最新版本的ANTLR.
我在使用ANTLR4中的Python目标时遇到了问题.似乎很少有可用的示例,并且相应的Java代码似乎并不相关.
我正在使用标准的Hello.g4语法:
// Define a grammar called Hello
grammar Hello;
r : 'hello' ID ; // match keyword hello followed by an identifier
ID : [a-z]+ ; // match lower-case identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
Run Code Online (Sandbox Code Playgroud)
示例(根据标准Hello.g4示例构建):
input_ = antlr4.FileStream(_FILENAME)
lexer = HelloLexer.HelloLexer(input_)
stream = antlr4.CommonTokenStream(lexer)
parser = HelloParser.HelloParser(stream)
rule_name = 'r'
tree = getattr(parser, rule_name)()
Run Code Online (Sandbox Code Playgroud)
我还写了一个听众.为了断言/验证这是正确的,我将在此重复:
class HelloListener(antlr4.ParseTreeListener):
def enterR(self, ctx):
print("enterR")
def exitR(self, ctx):
print("exitR")
def enterId(self, ctx):
print("enterId")
def exitId(self, …Run Code Online (Sandbox Code Playgroud) 我试图将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)