Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 铺层中的特殊情况lexer规则_Python_Lexer_Ply - Fatal编程技术网

Python 铺层中的特殊情况lexer规则

Python 铺层中的特殊情况lexer规则,python,lexer,ply,Python,Lexer,Ply,有没有办法在特殊情况下使用ply lexer规则 t_IDENT = r'[a-zA-Z_][0-9a-zA-Z_]*' t_OPERATOR = r'[<>=/*+-]+' t_DEFINE = r'=' t_PRODUCES = r'=>' 是的,您获得运算符令牌而不是预期的生成/定义的原因是PLY lexer的令牌优先规则: 在内部,lex.py使用re模块进行模式匹配。什么时候 在构建主正则表达式时,将在 顺序如下: 所有由函数定义的标记都按照它们的

有没有办法在特殊情况下使用ply lexer规则

t_IDENT     = r'[a-zA-Z_][0-9a-zA-Z_]*'
t_OPERATOR  = r'[<>=/*+-]+'
t_DEFINE    = r'='
t_PRODUCES  = r'=>'

是的,您获得
运算符
令牌而不是预期的
生成
/
定义
的原因是PLY lexer的令牌优先规则:

在内部,lex.py使用
re
模块进行模式匹配。什么时候 在构建主正则表达式时,将在 顺序如下:

  • 所有由函数定义的标记都按照它们的顺序添加 出现在lexer文件中
  • 由字符串定义的标记由 按减少正则表达式长度(longer)的顺序对它们进行排序 首先添加表达式
  • 只需将某些规则转换为函数:

    def t_DEFINE(t):
        r'='
        return t
    
    def t_PRODUCES(t):
        r'=>'
        return t
    

    我删除了自动
    t_DEFINE
    t_生成的
    规则,并使用保留字技术处理特殊情况:

    special_operators = {'=': 'DEFINE',
                         '=>': 'PRODUCES'}
    
    def t_OPERATOR(t):
        r'[<>=/*+-]+'
        t.type = special_operators.get(t.value, t.type)
        return t
    
    特殊_运算符={'=':'DEFINE',
    “=>”:“产生”}
    def t_操作员(t):
    r'[=/*+-]+'
    t、 type=特殊_运算符.get(t.value,t.type)
    返回t
    
    不要紧的可能重复,这与上述SO问题中的保留字问题基本相同,也在此处的文档中:
    special_operators = {'=': 'DEFINE',
                         '=>': 'PRODUCES'}
    
    def t_OPERATOR(t):
        r'[<>=/*+-]+'
        t.type = special_operators.get(t.value, t.type)
        return t