基于正则表达式的简单lexer

lexer的Python项目详细描述


用法

您定义词法规则,词汇表将它们作为查找表进行迭代匹配:

>>>importlexery>>>importre>>>text='crop \t   ( 20, 30, 40, 10 ) ;'>>>>>>lexer=lexery.Lexer(...rules=[...lexery.Rule(identifier='identifier',...pattern=re.compile(r'[a-zA-Z_][a-zA-Z_]*')),...lexery.Rule(identifier='lpar',pattern=re.compile(r'\(')),...lexery.Rule(identifier='number',pattern=re.compile(r'[1-9][0-9]*')),...lexery.Rule(identifier='rpar',pattern=re.compile(r'\)')),...lexery.Rule(identifier='comma',pattern=re.compile(r',')),...lexery.Rule(identifier='semi',pattern=re.compile(r';'))...],...skip_whitespace=True)>>>tokens=lexer.lex(text=text)>>>asserttokens==[[...lexery.Token('identifier','crop',0,0),...lexery.Token('lpar','(',9,0),...lexery.Token('number','20',11,0),...lexery.Token('comma',',',13,0),...lexery.Token('number','30',15,0),...lexery.Token('comma',',',17,0),...lexery.Token('number','40',19,0),...lexery.Token('comma',',',21,0),...lexery.Token('number','10',23,0),...lexery.Token('rpar',')',26,0),...lexery.Token('semi',';',28,0)]]

请注意,如果文本的一部分无法匹配,则会引发一个lexery.Error

>>>importlexery>>>importre>>>text='some-identifier ( 23 )'>>>>>>lexer=lexery.Lexer(...rules=[...lexery.Rule(identifier='identifier',pattern=re.compile(r'[a-zA-Z_][a-zA-Z_]*')),...lexery.Rule(identifier='number',pattern=re.compile(r'[1-9][0-9]*')),...],...skip_whitespace=True)>>>tokens=lexer.lex(text=text)Traceback(mostrecentcalllast):...lexery.Error:Unmatchedtextatline0andposition4:some-identifier(23)^

如果指定unmatched_identifier,则所有不匹配的字符都将累积到具有该标识符的标记中:

>>>importlexery>>>importre>>>text='some-identifier ( 23 )-'>>>>>>lexer=lexery.Lexer(...rules=[...lexery.Rule(identifier='identifier',pattern=re.compile(r'[a-zA-Z_][a-zA-Z_]*')),...lexery.Rule(identifier='number',pattern=re.compile(r'[1-9][0-9]*')),...],...skip_whitespace=True,...unmatched_identifier='unmatched')>>>tokens=lexer.lex(text=text)>>>asserttokens==[[...lexery.Token('identifier','some',0,0),...lexery.Token('unmatched','-',4,0),...lexery.Token('identifier','identifier',5,0),...lexery.Token('unmatched','(',16,0),...lexery.Token('number','23',18,0),...lexery.Token('unmatched',')-',21,0)]]

安装

  • 使用pip:
  • 安装lexery
pip3 install lexery

开发

  • 查看存储库。
  • 在存储库根目录中,创建虚拟环境:
python3 -m venv venv3
  • 激活虚拟环境:
source venv3/bin/activate
  • 安装开发依赖项:
pip3 install -e .[dev]

提交前检查

我们提供一组预提交检查,用于运行单元测试、lint和检查代码的格式。

即,我们使用:

  • yapf检查格式。
  • docstrings的样式用pydocstyle检查。
  • 使用mypy执行静态类型分析。
  • pylint进行各种棉绒检查。

从具有开发依赖项的激活虚拟环境本地运行预提交检查:

./precommit.py
  • 预提交脚本还可以自动格式化代码:
./precommit.py  --overwrite

版本控制

我们跟着Semantic Versioning。版本x.y.z表示:

  • X是主要版本(向后不兼容),
  • y是次要版本(向后兼容),并且
  • z是修补程序版本(向后兼容的错误修复)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
安卓如何对Java中声明为开关的数组求和?   使用java将32位2的补码转换为十进制   通过Javasocket使用BufferedStream通过数据流发送文件   如何从Java中的这个ArrayList快速了解大量字符串的ArrayList中的索引?   java Android动画错误,滑出并消除   java接口在扩展已经实现接口的抽象类的类上是必需的吗?   java如何编写一个类加载器来实现这一点?   Java/JavaFX:如何使用CSScommand访问resourcesfolder(路径)   java JLS的哪一部分说匿名类不能有公共/受保护/私有成员类   java可以将OnClickListener写入可打包文件吗?   java是否可以在同一台机器上运行socket服务器和socket客户端?   java Play framework 2.6.15(SBT1.1.6)   java如何声明返回泛型类的方法?   java为什么不支持线程。isInterrupted()即使在调用线程后也返回false。currentThread()。中断()   java查找2个数组的最大长度   java如何以编程方式在Android中的google drive中创建应用程序文件夹中的文件夹   java获取鼠标单击的坐标   java当我尝试访问wsdl时,为什么会得到“日志被禁用”?