0

我有一个用 PLY 编写的解析器,它具有以下标记定义

def t_COMMAND(t):
    r'create|show'
    return t

def t_SCOPE(t):
    r'user|domain'
    return t

def t_STRING(t):
    r'[a-zA-Z_@\*\.]*'
    return t

我正在尝试解析以下字符串

show user where created_on = foo

这是我的语法

S:COMMAND SCOPE FILTER;
FILTER:WHERE EXP |;
EXP:STRING OP STRING
...

我在令牌处收到语法错误created_on,可能是因为它被匹配为 aCOMMAND而不是STRING

有没有办法让 PLY 进行尽可能大的匹配?

4

1 回答 1

0

找到了两种可能的方法

  • 使用保留字元组并将其附加到令牌列表中,如令牌规范中所示

  • STRING如果可能,请在as中添加引号'[a-zA-Z_@\*\.]*',以便将其与COMMAND

我选择了第二种方法,因为我有很多所谓的保留字。

于 2014-07-25T05:27:34.730 回答