Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.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标记器单元测试:在生成的标记列表中插入一个标记_Python_Unit Testing_Tokenize_Ply - Fatal编程技术网

Python标记器单元测试:在生成的标记列表中插入一个标记

Python标记器单元测试:在生成的标记列表中插入一个标记,python,unit-testing,tokenize,ply,Python,Unit Testing,Tokenize,Ply,我实现了一个python标记器来从文本文件中提取标记。标记与字符串相关,字符串“适合”我为每个标记定义的模式(正则表达式)。我使用python包ply中的lexer功能来实现标记器。扫描文本文件后,所有找到的令牌将作为生成器返回。对于单元测试,我想在“返回的令牌列表”中的定义位置插入额外的令牌,以验证令牌化器在这种糟糕的情况下是否正确处理 如何使用ply(python模块ply.lex)创建一个“假”令牌对象,我可以将其插入令牌列表。如果您想将令牌插入lex流,您可以轻松地构造自己的令牌。(当然

我实现了一个python标记器来从文本文件中提取标记。标记与字符串相关,字符串“适合”我为每个标记定义的模式(正则表达式)。我使用python包ply中的lexer功能来实现标记器。扫描文本文件后,所有找到的令牌将作为生成器返回。对于单元测试,我想在“返回的令牌列表”中的定义位置插入额外的令牌,以验证令牌化器在这种糟糕的情况下是否正确处理


如何使用ply(python模块ply.lex)创建一个“假”令牌对象,我可以将其插入令牌列表。

如果您想将令牌插入lex流,您可以轻松地构造自己的令牌。(当然,如何插入代币取决于您自己。)

ply
文档中:

lexer.token()
返回的令牌是
LexToken
的实例。此对象具有属性
tok.type
tok.value
tok.lineno
tok.lexpos

tok.type
tok.value
属性包含令牌本身的类型和值
tok.line
tok.lexpos
包含有关令牌位置的信息。tok.lexpos是相对于输入文本开头的令牌索引

此外,令牌具有一个
lexer
属性,其值是创建令牌的lexer对象

这里有一个创建
LexToken
(改编自
lex.py
)的示例,用于合成
error
标记(
self
此时是lexer对象):


您是否使用生成的lexer的内置迭代支持?(如果是这样,您的描述是不正确的,因为迭代器在提供第一个标记之前不会扫描整个文件。)否。标记器进行词法分析,缓冲所有标记(在lexer对象中),但随后会在lexer对象上进行一些处理和循环(例如..in..:yield)。但是你是对的,它是一个生成器。Fkromer:那么你正在创建令牌列表,并且你想在列表中引入一些其他令牌。这听起来很合理,但我不明白为什么你会期望ply帮助你处理列表。我的问题是如何使用ply创建一个“假”令牌对象,并将其插入令牌列表中。好的,我回答了你刚才问的问题,尽管从你的实际问题来看,我显然不清楚。我建议编辑原始问题以添加上面的句子。由于“tok.lexpos是相对于输入文本开头的标记的索引”,我是否需要增加以下所有标记的tok.lexpos属性?我认为,至少在我想在两个标记之间插入一个“假”标记的情况下,这是必要的,例如,在您引用LexToken(数字,3,2,1)和LexToken(加上“+”,2,2)的示例的两个标记之间,使用LexToken(..,..,tok.lexpos).@fkromer:lineno和lexpos属性由框架提供,但框架不使用其他属性。通常,应用程序操作使用它们来注释错误消息或调试信息。因此,这将取决于您如何使用信息,但通常仅从上一个令牌复制信息不会有问题。另外一个提示:令牌通常作为生成器在应用程序中“通信”。由于生成器不可“订阅”,因此在添加列表项之前,需要将其转换为具有列表(生成器)的列表,例如列表[:idx]+[fake_token_object]+列表[idx:]
tok = LexToken()
tok.value = self.lexdata[lexpos:]
tok.lineno = self.lineno
tok.type = 'error'
tok.lexer = self
tok.lexpos = lexpos