【PLY】Lex和Yacc简单示例
PLY是流行的编译器构造工具lex和yacc的纯python实现。
PLY官方文档:http://www.dabeaz.com/ply/
PLY文档翻译:https://qyliang.blog.csdn.net/article/details/97686897
PLY由两个单独的模块组成lex.py和 yacc . py 。都可以在名为ply的Python包中找到。
lex.py模块用于将输入的文本通过正则表达式转化成一系列特定的token。
yacc.py用于识别以上下文无关语法形式指定的语言语法。
lex示例
# ------------------------------------------------------------
# calclex.py
#
# tokenizer for a simple expression evaluator for
# numbers and +,-,*,/
# ------------------------------------------------------------
import ply.lex as lex# List of token names. This is always required
tokens = ('NUMBER','PLUS','MINUS','TIMES','DIVIDE','LPAREN','RPAREN',
)# Regular expression rules for simple tokens
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIVIDE = r'/'
t_LPAREN = r'\('
t_RPAREN = r'\)'# A regular expression rule with some action code
def t_NUMBER(t):r'\d+'t.value = int(t.value) return t# Define a rule so we can track line numbers
def t_newline(t):r'\n+'t.lexer.lineno += len(t.value)# A string containing ignored characters (spaces and tabs)
t_ignore = ' \t'# Error handling rule
def t_error(t):print("Illegal character '%s'" % t.value[0])t.lexer.skip(1)# Build the lexer
lexer = lex.lex()# =============================================================================
# Test it out
# =============================================================================
# Test it out
data = '''
3 + 4 * 10+ -20 *2'''# Give the lexer some input
lexer.input(data)# Tokenize
while True:tok = lexer.token()if not tok: break # No more inputprint(tok)
最终打印结果:
YACC示例
# Yacc exampleimport ply.yacc as yacc# Get the token map from the lexer. This is required.
from LexExample import tokensdef p_expression_plus(p):'expression : expression PLUS term'p[0] = p[1] + p[3]def p_expression_minus(p):'expression : expression MINUS term'p[0] = p[1] - p[3]def p_expression_term(p):'expression : term'p[0] = p[1]def p_term_times(p):'term : term TIMES factor'p[0] = p[1] * p[3]def p_term_div(p):'term : term DIVIDE factor'p[0] = p[1] / p[3]def p_term_factor(p):'term : factor'p[0] = p[1]def p_factor_num(p):'factor : NUMBER'p[0] = p[1]def p_factor_expr(p):'factor : LPAREN expression RPAREN'p[0] = p[2]# Error rule for syntax errors
def p_error(p):print("Syntax error in input!")# Build the parser
parser = yacc.yacc()while True:try:s = input('calc > ')#s = '3 + 5 * (10 - 20)'except EOFError:breakif not s: continueresult = parser.parse(s)print(result)
打印结果为:
对于结果的解释和跟多的细节在文档中有介绍。
【PLY】Lex和Yacc简单示例相关推荐
- Python语法解析器PLY——lex and yacc in Python - 娄振林专栏 - 博客频道 - CSDN.NET
Python语法解析器PLY--lex and yacc in Python - 娄振林专栏 - 博客频道 - CSDN.NET Python语法解析器PLY--lex and yacc in Pyt ...
- PLY库-实现最简单的sql语法的数据库
本文通过PLY实现一个简单的sql库 本文主要简述一下,有关语法解析的库的使用,并使用改实例编写一个简单的模仿最基本的sql语句的数据库,本文代码仅供示例参考. 语法解析与上下文 语法解析是一个比较大 ...
- Lex和Yacc应用方法(一).初识Lex
Lex和Yacc应用方法(一).初识Lex 草木瓜 20070301 Lex(Lexical Analyzar 词法分析生成器),Yacc(Yet Another Compiler Compiler ...
- Lex和Yacc应用方法(二).再识Lex与Yacc
Lex和Yacc应用方法(二).再识Lex与Yacc 草木瓜 20070314 早在二十世记七十年代之前,编写编译器一直是一个非常费时的工作.但到了1975这 一年这一切却发生了重大转变,首先Ste ...
- lex(flex)yacc(bison)
初始配置 文法分析用Flex(Lex):将数据分隔成一个个的标记token (标示符identifiers,关键字keywords,数字numbers, 中括号brackets, 大括号braces, ...
- Windows下lex 与 yacc的使用
Windows下lex 与 yacc的使用 首先 下载下载flex和bison.网址是http://pan.baidu.com/s/1dDlfiW5 选择下载就好了,下载后解压到你电脑中的任一盘中. ...
- LEX和YACC的使用(例子)
1.简单C语言的词法分析程序; %{ #include<stdio.h> #include<stdlib.h> #include<ctype.h> #include ...
- lex和yacc环境配置
lex和yacc的使用很简单,但环境配置却是各种问题,本章说明lex和yacc在windows下的环境配置. 软件需求: 系统 win7-64位(win7-32, win8, win10全部通过) c ...
- LEX和YACC的使用
Lex自动地表示把输入串词法结构的正规式及相应的动作转换成一个宿主语言的程序,即词法分析程序,它有一个固定的名字yyler,在这里yyler是一个C语言的程序. Yylex将识别出输入串中的词形 ...
- Windows下使用Lex和Yacc
Windows下使用Lex和Yacc多种多样,简单罗列如下: 1.Cygwin Cygwin是Windows平台上运行的unix/linux模拟环境,由Cygnus Solution ...
最新文章
- 图1 ----节选CEC2015年中结果展示
- EqualLogic 6100 V6 Synchronous Replication
- 手把手部署Linux下磁盘配额(quota)应用与实战
- pandas 补充笔记:转换提取类型
- LeetCode OJ:Construct Binary Tree from Preorder and Inorder Traversal(从前序以及中序遍历结果中构造二叉树)...
- 开源的excel读取库libxls在windows下的编译,且支持中文,全网首发
- mysql 远程登陆设置_MYSQL远程登录权限设置
- 深入解析:DBA_OBJECTS中的OBJECT_ID与DATA_OBJECT_ID的区别
- PyTorch基础(六)迁移学习
- Google发布Java 核心工具库——Guava 28.0
- 专访Two Sigma CEO Nobel: 当前AI投资有太多的炒作
- 【LabView小剧场】用LabView做个计算器
- 微pe工具箱是微软的吗_电脑装系统用一键装机好用还是微PE工具箱好用
- 宽度学习系统(BLS)的原理、变体形式及当前应用(随时更新......)
- Softmax函数及其导数
- 关于--如何查看外网IP地址
- Java基础-子类和父类之间的诡异事件
- uniapp使用百度地图
- SAP-MM知识精解-常见报表汇总(01)
- 新来个阿里 P7,仅花 2 小时,撸出一个多线程永动任务,看完直接跪了,真牛逼!...
热门文章
- GML可视化学习(三)
- 阿里云盘内测申请_阿里云网盘开放内测申请,网盘行业又成香饽饽了?
- uniapp ios时间戳获取不到_个人小程序uniapp实战开发(三):数据库设计与文章列表...
- VS2010 C++环境下DLL和LIB文件目录及名称修改
- 计算机软件版本号是什么意思,带你深入了解解密Windows系统版本和版本号
- vi/vim编辑器使用方法详解
- web安全之信息收集
- sg nc的java下载,01_SG-NC-客户端安装说明及培训材料下载 3
- linux mate桌面主题下载_5个适用于Linux的最佳图标主题
- JPack发布0.5.0