我正在使用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) 我想安装ANTLRWorks插件,但Netbeans说:
Some plugins require plugin **Editor Settings Storage** to be installed.
The plugin Editor Settings Storage is requested in implementation version 201302132200. The following plugin is affected: ANTLRWorks Editor
Some plugins require plugin **Editor Options** to be installed.
The plugin Editor Options is requested in implementation version 201302132200. The following plugin is affected: ANTLRWorks Editor
Run Code Online (Sandbox Code Playgroud)
我无法在互联网上找到这些插件,也没有关于此问题的信息(只有来自其他人的相同问题)
有任何想法如何更新这些插件?
我发现该插件需要较旧版本的
org.netbeans.modules.editor.settings.storage 201302132200,我的版本为201306052037.我可以降级netbeans中的插件吗?
ANTLRWorks2中的TestDriver似乎有点挑剔,它什么时候会接受没有和明确的语法EOF,什么时候不接受.ANTLR4入门指南中的Hello语法不会在任何地方使用,因此我推断如果可能的话,最好避免显式.EOFEOF
使用的最佳做法是EOF什么?你什么时候需要它?
我想使用Antlr4来解析我的C#应用程序中的一些文件.鉴于我的语法,到目前为止,我已经能够生成解析器和词法分析器文件.现在我想在文件中使用read并将解析器和词法分析器应用于它们.我一直在寻找有关如何做到这一点的文档,但我很简短.我找到了一些使用以前版本的Antlr的旧例子,但它们似乎不适用于Antlr4.任何帮助,将不胜感激.谢谢.
我正在尝试在Eclipse Luna(4.4)上安装ANTLR 4 IDE.我已经从Marketplace安装了它,但我不知道如何创建一个包含ANTLR 4 Lexer/Parser的项目.
当我去创建一个新项目时,我没有看到ANTLR 4的任何选项.我尝试创建一个.g4文件,它在编辑器中打开,但是当我保存它没有做任何事情.
我正在尝试为juniper/srx路由器访问控制列表编写解析器.以下是我使用的语法:
grammar SRXBackend;
acl:
'security' '{' 'policies' '{' COMMENT* replaceStmt '{' policy* '}' '}' '}'
applications
addressBook
;
replaceStmt:
'replace:' IDENT
| 'replace:' 'from-zone' IDENT 'to-zone' IDENT
;
policy:
'policy' IDENT '{' 'match' '{' fromStmt* '}' 'then' (action | '{' action+ '}') '}'
;
fromStmt:
'source-address' addrBlock # sourceAddrStmt
| 'destination-address' addrBlock # destinationAddrStmt
| 'application' (srxName ';' | '[' srxName+ ']') # applicationBlock
;
action:
'permit' ';'
| 'deny' ';'
| 'log { session-close; }'
;
addrBlock:
'[' srxName+ …Run Code Online (Sandbox Code Playgroud) 基本上,我需要预见知道某个令牌是否存在,但是没有匹配它(即,这样另一个解析器规则仍然可以匹配它).
问题的确切细节是"END-ALL"条款.该语言具有类似"IF"(由"END-IF"关闭),"FOR"(由"END-FOR"关闭)等结构.
但是可以选择使用"END-ALL"全局关闭所有这样的开环(因此不需要实际的"END-IF"或"END-FOR"子句).
无论如何我能正确实现吗?
我正在尝试在我的C++项目中使用ANTLR.我为指定的语法创建了运行ANTLR生成器的目标,并使主要的prjct依赖于它.
ADD_CUSTOM_TARGET(GenerateParser
COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g
-o ${PROJECT_SOURCE_DIR}/src/MyGrammar
)
ADD_LIBRARY(MainProject ${LIBRARY_TYPE} ${TARGET_SOURCES} ${TARGET_OPTIONS})
ADD_DEPENDENCIES(MainProject GenerateParser)
Run Code Online (Sandbox Code Playgroud)
问题是每次构建项目时都会运行ANTLR生成器并消耗足够的时间.我怎样才能让它只运行我的语法?或者可能有可能使ANTLR以某种方式仅为过时语法生成解析器.
我一直在使用lex/yacc,现在我正在尝试切换到ANTLR.主要关注的是ANTLR是一个LL(*)解析器,与yacc不同,它是LALR.我习惯于自下而上思考,我不知道LL语法的优点是什么.人们说LL语法现在更容易理解,更受欢迎.但似乎LR解析器更强大,例如LL解析器无法处理左递归,尽管似乎有一些解决方法.
那么问题是LL语法比LALR有什么优势?如果有人能给我一些例子,我会很感激.有用文章的链接也很棒.
感谢您的帮助!
(我认为这是一个很好的资源:LL解析器对LR解析器有什么优势?但是对于一些例子它会更好.)