基于正则表达式的简单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读取SSLSocket的最快或最佳方式   JavaGuice向类构造函数注入对象   java类不是抽象的,并且不会覆盖OnClickListener中的抽象方法onClick(视图)   java OpenGL 1.1更改颜色更改以前的颜色?   c#将Java/Android连接到。网络服务   java在节点上生成AES密钥   java Liferay与MarkLogic XDBC数据库集成   java使用静态初始化块来提高性能   java如何在需要不同参数的另一个方法中使用同一类中的方法   音频Java多种声音   Java显式引用转换   java Intellij,如何在maven项目中导入模块   java在什么条件下调用ELResolver的setValue方法?   java在beanshell中计算代码字符串并获取beanshell解释器返回的值   javascript将音频文件上载到服务器并从服务器响应设置图像   编码风格清理java代码,多个else if语句   java是否需要使此变量可变?   java线程未更新GlassPane上的进度条   java关闭调试模式@Vaadin Spring启动应用程序