在lex中识别关键字对

2024-04-19 17:35:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图为一个利用关键字对(用空格分隔)的文件类型编写一个解析器,并且正在努力寻找正确的方法来实现这一点。令牌的一些示例可能是:

angle spring
angle dampen
angle collision

还有块定义和结束该块的标记,例如:

^{pr2}$

新行似乎很重要,我一直在使用它来确定我是在查看关键字还是只查看常规的旧字符串(关键字应该是每行的第一个标记)。我走这条路对吗?我是否应该在yacc阶段将所有内容标记化并更严格地定义对?在

谢谢你的时间!在


Tags: 方法标记解析器利用示例定义关键字常规
1条回答
网友
1楼 · 发布于 2024-04-19 17:35:32

问题是,您试图将逻辑上的单个令牌视为多个令牌。如果关键字包含空格,则表示空格是关键字标记的一部分。在

如果您定义了关键字标记,包括在解析器中不需要处理它们的空格。这意味着您应该将关键字匹配与普通标识符匹配分开。在

例如:

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}$

而不是:

def p_dynamics(p):
    'DYNAMICS BLOCK END_DYNAMICS'

根据限制,你有一个解决方案可能更容易实现。在

相关问题 更多 >