识别lex中的关键字对

斯潘塞瓦

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

angle spring
angle dampen
angle collision

还有块定义和以该块结尾的令牌,例如:

dynamics
    angle spring 1.0
    angle dampen 0.0
    angle collision 0.0
    some 1 2 3
    more ['stuff' 'here']
    tokens "values can be strings, paths, etc"
end dynamics

换行符似乎很重要,我一直在用它来确定我要查看的是关键字还是仅仅是常规的旧字符串(关键字应是每行的第一个标记)。我是否采用正确的方法?我是否应该只在yacc阶段对所有内容进行标记并更严格地定义对?

谢谢你的时间!

巴库留

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

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

例如:

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装饰器动态设置函数的文档字符串这允许将复杂的正则表达式用于定义标记,即使使用表达式而不是简单的字符串文字来“定义”定义它们也是如此。


另一种方法是将以空格分隔的关键字视为多个关键字。因此,您保留了标识符和关键字的常规定义,并修改了语法以使用多个关键字而不是一个。

例如,您将具有如下语法规则:

def p_dynamics(p):
    'DYNAMICS BLOCK END DYNAMICS'

代替:

def p_dynamics(p):
    'DYNAMICS BLOCK END_DYNAMICS'

根据约束条件,您可能会更容易实现一种解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

识别lex中的关键字对

来自分类Dev

Lex:C关键字规则无法正确识别

来自分类Dev

在淘汰订阅功能中识别此关键字的目标

来自分类Dev

PhpMyAdmin中的关键字无法识别错误

来自分类Dev

使用PocketSphinx识别多个关键字

来自分类Dev

Webstorm无法识别“ require”关键字

来自分类Dev

FlatList 的 renderItem 无法识别“this”关键字

来自分类Dev

Dart中的“ with”关键字

来自分类Dev

OCaml中的“ as”关键字

来自分类Dev

Java中的关键字“ of”

来自分类Dev

js中的this关键字

来自分类Dev

在cpp项目中编译的c模块中无法识别内联关键字(VS2005)

来自分类Dev

Python Pocketsphinx:无法从.wav文件中识别关键字

来自分类Dev

Parslet:识别除给定关键字之外的任何内容

来自分类Dev

需要仅在正确的位置识别关键字

来自分类Dev

Android上的小型语音识别以查找关键字

来自分类Dev

无法识别两个关键字

来自分类Dev

实体框架[关键字]标签无法识别

来自分类Dev

Robot Framework无法识别某些类关键字

来自分类Dev

如何让visual studio识别某些关键字

来自分类Dev

关于Javascript中的“ this”关键字的困惑

来自分类Dev

在XML中查找关键字的计数

来自分类Dev

理解JavaScript中的类关键字

来自分类Dev

Swift参数中的默认关键字

来自分类Dev

Python:列表理解中的'as'关键字?

来自分类Dev

尝试块中的`Fault`关键字

来自分类Dev

jQuery中的这个关键字

来自分类Dev

“输入”是Python中的关键字吗?

来自分类Dev

Java中的static关键字