标签: antlr

解析维基媒体标记 - 基于EBNF的解析器是不是很适合?

我试图解析(在Java中)维基百科上的Wikiimedia标记.有许多现有的包用于此任务,但我没有发现任何特别适合我的需求.我使用过的最好的软件包是Mathclipse Bliki解析器,它在大多数页面上都做得不错.

但是,此解析器不完整,无法解析某些页面或无法正确解析其他页面.可悲的是,代码相当混乱,因此修复此解析引擎中的问题非常耗时且容易出错.

在尝试找到一个更好的解析引擎时,我已经研究过使用基于EBNF的解析器来完成这项任务(特别是ANTLR).经过一些尝试后,似乎这种方法并不特别适合这项任务,因为维基媒体标记相对宽松,因此不能轻易地融入结构化语法.

我对ANTLR和类似解析器的经验非常有限,因此可能是我的经验不足导致问题,而不是这样的解析器天生就不适合这项任务.任何对这些话题有更多经验的人都可以在这里说点吗?

@Stobor:我已经提到我已经查看了各种解析引擎,包括谷歌查询返回的引擎.到目前为止我发现的最好的是Bliki引擎.问题是修复这些解析器的问题变得非常繁琐,因为它们本质上都是条件和正则表达式的长链,导致意大利面条代码.我正在寻找更类似于EBNF解析方法的东西,因为该方法更清晰,更简洁,因此更容易理解和发展.我已经看过你发布的mediawiki链接,似乎证实了我怀疑开箱即用的EBNF不适合这个任务.因此,我正在寻找一个像EBNF一样清晰易懂的解析引擎,但也能够处理wiki标记的混乱语法.

java parsing antlr ebnf wikitext

9
推荐指数
1
解决办法
1318
查看次数

开始使用ANTLR并避免常见错误

我已经开始学习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

9
推荐指数
2
解决办法
3604
查看次数

在ANTLR中,如何指定特定的重复次数?

我正在使用ANTLR指定包含不超过254个字符的行的文件格式(不包括行结尾).如何在语法中对此进行编码,但不做:

line : CHAR? CHAR? CHAR? CHAR? ... (254 times)
Run Code Online (Sandbox Code Playgroud)

antlr

9
推荐指数
1
解决办法
1515
查看次数

ANTLR JavaScript目标

我一直在使用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目标的材料,那就太棒了.

谢谢

javascript antlr

9
推荐指数
1
解决办法
7832
查看次数

LL(*)解析器如何工作?

我在Internet上找不到关于LL(*)解析器的任何完整描述,例如ANTLR.

我想知道LL(k)解析器和LL(*)之间的区别是什么,以及为什么它们不能支持left-recusrive语法,尽管它们具有灵活性.

algorithm parsing antlr context-free-grammar

9
推荐指数
1
解决办法
953
查看次数

ANTLR Parser带有手动词法分析器

我正在将基于C#的编程语言编译器从手动词法分析器/解析器迁移到Antlr.

Antlr一直给我带来严重的头痛,因为它通常大部分都有效,但是有些小部件没有,而且难以解决.

我发现我的大部分头痛都是由Antlr的词法分析器部分引起的,而不是解析器引起的.然后我注意到parser grammar X;并意识到也许我可以手动编写lexer,然后是Antlr生成的解析器.

所以我正在寻找关于这个主题的更多文档.我想自定义ITokenStream可以工作,但似乎几乎没有关于这个主题的在线文档...

c# antlr parser-generator lexer

9
推荐指数
1
解决办法
1480
查看次数

ANTLR语法的编辑器生成器?

我正在使用ANTLR来创建一种新的通用编程语言,我对此非常满意.

由于我想提供好的工具来简化用我的语言编写的程序的开发,我开始考虑通过适当的Eclipse插件实现该语言的编辑器.

是否有任何工具/项目允许您拥有一个完全成熟的编辑器(具有语法突出显示,代码完成等).我知道Xtext允许你自动执行此操作,ANTLR怎么样?

我已经看到这封邮件到ANTLR邮件列表,但它没有答案

antlr editor xtext antlr3

9
推荐指数
1
解决办法
1904
查看次数

使用ANTLR进行Java源文件的静态分析

有没有人有一个完整的实现(可能是github或googlecode)来使用ANTLR语法文件和Java源代码来分析Java源代码.例如,我想简单地计算变量,方法等的数量.

还使用了最新版本的ANTLR.

java antlr

9
推荐指数
1
解决办法
2508
查看次数

ANTLR4和Python目标

我在使用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)

python antlr antlr4

9
推荐指数
1
解决办法
5841
查看次数

慢速ANTLR4在Python中生成Parser,但在Java中生成速度很快

我试图将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)

python java parsing antlr antlr4

9
推荐指数
1
解决办法
1859
查看次数