Antlr 忽略除我为其创建解析器的位之外的所有内容
我试图从几千个库的setup.py中提取Antlr 忽略除我为其创建解析器的位之外的所有内容,antlr,antlr4,Antlr,Antlr4,我试图从几千个库的setup.py中提取setup\u requires和test\u requires值。我有这本语法书 grammar SetupPy ; file_input: (ignore setupRequires | ignore testRequires )* EOF; setupRequires : SETUPDEC '[' dependencyValue* (',' dependencyValue)* ']'; testRequires : TESTDEC '[' de
setup\u requires
和test\u requires
值。我有这本语法书
grammar SetupPy ;
file_input: (ignore setupRequires | ignore testRequires )* EOF;
setupRequires : SETUPDEC '[' dependencyValue* (',' dependencyValue)* ']';
testRequires : TESTDEC '[' dependencyValue* (',' dependencyValue)* ']';
ignore: UNKNOWN_CHAR;
dependencyValue: LISTVAL;
//ignore : UNKNOWN_CHAR? ;
LISTVAL: SHORT_STRING;
SETUPDEC: 'setup_requires' '=';
TESTDEC: 'tests_require' '=';
UNKNOWN_CHAR: . -> channel(HIDDEN);
fragment SHORT_STRING: '\'' ( STRING_ESCAPE_SEQ | ~[\\\r\n\f'] )* '\''
| '"' ( STRING_ESCAPE_SEQ | ~[\\\r\n\f"] )* '"';
fragment STRING_ESCAPE_SEQ
: '\\' .
| '\\'
;
这是一个非常简单的例子。但是,当我把它放在一个完整的文件上时,令牌会被文件中的其他东西绊倒
# -*- coding: utf-8 -*-
from __future__ import with_statement
from setuptools import setup
def get_version(fname='mccabe.py'):
with open(fname) as f:
for line in f:
if line.startswith('__version__'):
return eval(line.split('=')[-1])
def get_long_description():
descr = []
for fname in ('README.rst',):
with open(fname) as f:
descr.append(f.read())
return '\n\n'.join(descr)
setup(
name='mccabe',
version=get_version(),
description="McCabe checker, plugin for flake8",
long_description=get_long_description(),
keywords='flake8 mccabe',
author='Tarek Ziade',
author_email='tarek@ziade.org',
maintainer='Ian Cordasco',
maintainer_email='graffatcolmingov@gmail.com',
url='https://github.com/pycqa/mccabe',
license='Expat license',
py_modules=['mccabe'],
zip_safe=False,
setup_requires=['pytest-runner'],
tests_require=['pytest'],
entry_points={
'flake8.extension': [
'C90 = mccabe:McCabeChecker',
],
},
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Console',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Operating System :: OS Independent',
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Topic :: Software Development :: Libraries :: Python Modules',
'Topic :: Software Development :: Quality Assurance',
],
)
如何设置此语法以忽略除我指定的两个值之外的所有内容?在查看了您前面的问题以及解析简化输入的方便性之后,我认为最快的方法是对这些文件进行简单的文本预处理,丢弃所有你不需要的东西,只保留你感兴趣的两部分。 例如:
设置\u需要
]
的位置,这将表示设置结束\u需要数组定义
setup\u requires=['pytest-runner']
写入输出文件测试_require
,请遵循类似的方法,并将其附加到输出文件中在看了前面的问题和解析简化输入的简单性之后,我认为最快的方法是对这些文件进行简单的文本预处理,丢弃所有不需要的内容,只保留您感兴趣的两部分。 例如:
设置\u需要
]
的位置,这将表示设置结束\u需要数组定义
setup\u requires=['pytest-runner']
写入输出文件测试_require
,请遵循类似的方法,并将其附加到输出文件中我认为你的方法是正确的。我很高兴很快就能看到。我认为你的方法是正确的。我很乐意尽快看一看。嗯,那当然是可行的。我试试看。因此,antlr不是作为“搜索和解析”设置的,它真正的设置是解析完整的文件hu。@scphantm是的,它是为解析完整的输入流而设计的。因此,我的方法基本上是使用一些简单的文本处理来提供一个输入流,我已经帮助您正确地理解了语法。语言是您的选择,文本处理非常简单。我想你能做到,而且很快!这东西在抽搐。快速的语法。对于列表值片段,它将返回引号和双引号。我该如何修改它以过滤掉这些内容并只给我文本?对它进行一些修改,但我想知道,一旦你在侦听器或访问者中有了列表标记,为什么不替换第一个和最后一个字符“或”“什么都没有,怎么办?时间上的压力比搞乱语法容易。按照定义短字符串的方式,引号是标记的一部分。在你的听众或访客中很容易处理。好吧,如果这更容易的话。我想这件事会像regex一样有一个向后看和向前看的功能。好吧,那当然是可行的。我试试看。因此,antlr不是作为“搜索和解析”设置的,它真正的设置是解析完整的文件hu。@scphantm是的,它是为解析完整的输入流而设计的。因此,我的方法基本上是使用一些简单的文本处理来提供一个输入流,我已经帮助您正确地理解了语法。语言是您的选择,文本处理非常简单。我想你能做到,而且很快!这东西在抽搐。快速的语法。对于列表值片段,它将返回引号和双引号。我该如何修改它以过滤掉这些内容并只给我文本?对它进行一些修改,但我想知道,一旦你在侦听器或访问者中有了列表标记,为什么不替换第一个和最后一个字符“或”“什么都没有,怎么办?时间上的压力比搞乱语法容易。按照定义短字符串的方式,引号是标记的一部分。在你的听众或访客中很容易处理。好吧,如果这更容易的话。我想这东西会像regex一样有向后看和向前看的功能。