0

如果我有一个关键字,一旦遇到关键字,我怎么能得到它来获取该行的其余部分并将其作为字符串返回?一旦遇到行尾,返回该行上的所有内容。

这是我正在查看的行:

  description here is the rest of my text to collect

因此,当词法分析器遇到描述时,我希望“这是我要收集的其余文本”作为字符串返回

我定义了以下内容,但似乎引发了错误:

states = (
     ('bcdescription', 'exclusive'),
)

def t_bcdescription(t):
    r'description '
    t.lexer.code_start = t.lexer.lexpos
    t.lexer.level = 1
    t.lexer.begin('bcdescription')

def t_bcdescription_close(t):
    r'\n'
    t.value = t.lexer.lexdata[t.lexer.code_start:t.lexer.lexpos+1]
    t.type="BCDESCRIPTION"
    t.lexer.lineno += t.valiue.count('\n')
    t.lexer.begin('INITIAL')
    return t

这是返回的错误的一部分:

  File "/Users/me/Coding/wm/wm_parser/ply/lex.py", line 393, in token
raise LexError("Illegal character '%s' at index %d" % (lexdata[lexpos],lexpos), lexdata[lexpos:])
ply.lex.LexError: Illegal character ' ' at index 40

最后,如果我想要这个功能用于多个令牌,我该如何实现呢?

谢谢你的时间

4

2 回答 2

0

你的代码没有大问题,其实我只是复制你的代码并运行它,它运行良好

import ply.lex as lex 

states = ( 
     ('bcdescription', 'exclusive'),
)

tokens = ("BCDESCRIPTION",)

def t_bcdescription(t):
    r'\bdescription\b'
    t.lexer.code_start = t.lexer.lexpos
    t.lexer.level = 1 
    t.lexer.begin('bcdescription')

def t_bcdescription_close(t):
    r'\n'
    t.value = t.lexer.lexdata[t.lexer.code_start:t.lexer.lexpos+1]
    t.type="BCDESCRIPTION"
    t.lexer.lineno += t.value.count('\n')
    t.lexer.begin('INITIAL')
    return t

def t_bcdescription_content(t):
    r'[^\n]+'

lexer = lex.lex()
data = 'description here is the rest of my text to collect\n'
lexer.input(data)

while True:
    tok = lexer.token()
    if not tok: break      
    print tok 

结果是:

LexToken(BCDESCRIPTION,' here is the rest of my text to collect\n',1,50)

所以也许你可以检查你的代码的其他部分

如果我想要这个功能用于多个标记,那么您可以简单地捕获单词,当这些标记中出现一个单词时,开始通过上面的代码捕获其余内容。

于 2013-11-25T11:27:03.803 回答
-1

在没有更多信息的情况下,为什么需要为此使用词法分析器/解析器并不明显。

>>> x = 'description here is the rest of my text to collect'
>>> a, b = x.split(' ', 1)
>>> a
'description'
>>> b
'here is the rest of my text to collect'
于 2012-12-23T20:45:05.610 回答