from ply.lex import TOKEN
KEYWORDS = [
r'some', r'keyword',
r'keyword with token',
r'other keyword',
]
keyword = '|'.join(keyword.replace(' ', '\s+') for keyword in KEYWORDS)
@TOKEN(keyword)
def t_KEYWORD(t):
# remove spaces
value = ''.join(x for x in t.value if not x.isspace())
return value.upper()
问题是,您试图将逻辑上的单个令牌视为多个令牌。如果关键字包含空格,则表示空格是关键字标记的一部分。在
如果您定义了关键字标记,包括在解析器中不需要处理它们的空格。这意味着您应该将关键字匹配与普通标识符匹配分开。在
例如:
注意
@TOKEN(keyword)
行:可以使用TOKEN
修饰符动态设置函数的docstring。这允许使用复杂的正则表达式来定义标记,即使定义它们“需要”使用表达式而不是简单的字符串文本。在另一种方法是将空格分隔的关键字视为多个关键字。因此,您保留标识符和关键字的常规定义,并修改语法以使用多个关键字而不是一个关键字。在
例如,你会有一个语法规则,比如:
^{pr2}$而不是:
根据限制,你有一个解决方案可能更容易实现。在
相关问题 更多 >
编程相关推荐