• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
james1207

博客园    首页    新随笔    联系   管理    订阅  订阅

python实现词法分析

#请先安装Ply
# -*- coding: utf-8 -*-
#--------------------------------------------------------------------------
#Author:Jmdebugger
#email: pengkailb@gmail.com
#date: 2013-9-17
#--------------------------------------------------------------------------
import ply.lex as lex

tokens = [
    "TOKEN_IDENT",
    "TOKEN_INT",
    "TOKEN_FLOAT",
    "TOKEN_STRING",
    "TOKEN_OP",
    "TOKEN_DELIM_COMMA",        #,
    "TOKEN_DELIM_OPEN_PAREN",   #(
    "TOKEN_DELIM_CLOSE_PAREN",  #)
    "TOKEN_DELIM_OPEN_BRACKET", #[
    "TOKEN_DELIM_CLOSE_BRACKET",#]
    "TOKEN_DELIM_OPEN_BRACE",   #{
    "TOKEN_DELIM_CLOSE_BRACE",  #}
    "TOKEN_DELIM_SEMICOLON"    #;
    
    ]

reserved = {
   'if'     :   'TOKEN_RSRVD_IF',
   'else'   :   'TOKEN_RSRVD_ELSE',
   'true'   :   'TOKEN_RSRVD_TRUE',
   'false'  :   'TOKEN_RSRVD_FALSE',
   'while'  :   'TOKEN_RSRVD_WHILE',
   'break'  :   'TOKEN_RSRVD_BREAK',
   'continue':  'TOKEN_RSRVD_CONTINUE',
   'goto'   :   'TOKEN_RSRVD_GOTO',
   'func'   :   'TOKEN_RSRVD_FUNC',
   'var'    :   'TOKEN_RSRVD_VAR',
   'for'    :   'TOKEN_RSRVD_FOR',
   'return' :   'TOKEN_RSRVD_RETURN'
}

tokens += reserved .values()


t_ignore = r' \t\r'
def t_COMMENT(t):
    r'(/\*(.|\n)*?\*/)|(\/\/.*)'
    pass

def t_newline(t):
    r'\n+'
    t.lexer.lineno += len(t.value)
    
def t_error(t):
    print "LaunchScript error: "+repr(t.value)
    
def t_TOKEN_IDENT(t):
    r'[a-zA-Z_][a-zA-Z_0-9]*' #标识符
    t.type = reserved.get(t.value , 'TOKEN_IDENT')
    return t

def t_TOKEN_INT(t):
    r'(0x[a-fA-F0-9]+)|([0-9]+)'
    return t

t_TOKEN_FLOAT =  r'[0-9]*\.[0-9]+'
t_TOKEN_STRING = r'(\"([^\\\r]|(\\.))*?\")' #|(\"([^\\\n]|(\\.))*?\")' only for windows
t_TOKEN_DELIM_COMMA = r'\,'
t_TOKEN_DELIM_OPEN_PAREN = r'\('
t_TOKEN_DELIM_CLOSE_PAREN = r'\)'
t_TOKEN_DELIM_OPEN_BRACKET = r'\['
t_TOKEN_DELIM_CLOSE_BRACKET = r'\]'
t_TOKEN_DELIM_OPEN_BRACE = r'\{'
t_TOKEN_DELIM_CLOSE_BRACE = r'\}'
t_TOKEN_DELIM_SEMICOLON = r'\;'

def t_TOKEN_OP(t):
    r'(\<\<\=)|(\>\>\=)|([\+\-\*\/\%\&\|\^\=\!\>\<]\=)|(\|\|)|(\&\&)|(\+\+)|(\-\-)|[\+\-\*\/\%\^\=\&\|\>\<\!\~]'
    return t



    
if __name__ == "__main__":
    lexer = lex.lex()
    f = open("./test.txt" , 'rb')
    data = f.read()
    f.close()
    lexer.input(data)

    while True:
        tok = lexer.token()
        if not tok: break      # No more input
        print tok.value+"\t---->\t"+tok.type

    


posted @ 2013-09-18 18:59  Class Xman  阅读(612)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3