0

我正在用 Python 学习词法分析器。我正在使用 Ply 库对某些字符串进行词法分析。我已经为一些 C++ 语言语法实现了以下词法分析器。

但是,我面临着一种奇怪的行为。当我在其他函数定义的末尾定义COMMENT时,代码可以正常工作。 states function definitions如果我在其他定义之前定义COMMENT state functions ,则只要//输入字符串中的 sectoin 开始,就会出现错误。

这背后的原因是什么?

import ply.lex as lex

tokens = (
        'DLANGLE',       # <<
        'DRANGLE',       # >>
        'EQUAL',        # =
        'STRING',       # "144"
        'WORD',         # 'Welcome' in "Welcome."
        'SEMICOLON',    # ;

)

t_ignore                = ' \t\v\r' # shortcut for whitespace


states = (
        ('cppcomment', 'exclusive'),   # <!--
)



def t_cppcomment(t): # definition here causes errors
    r'//'
    print 'MyCOm:',t.value

    t.lexer.begin('cppcomment');



def t_cppcomment_end(t):
    r'\n'
    t.lexer.begin('INITIAL');


def t_cppcomment_error(t):
    print "Error FOUND"
    t.lexer.skip(1)

def t_DLANGLE(t):

    r'<<'
    print 'MyLAN:',t.value
    return t

def t_DRANGLE(t):
    r'>>'
    return t

def t_SEMICOLON(t):

    r';'
    print 'MySemi:',t.value
    return t;

def t_EQUAL(t):
        r'='
        return t

def t_STRING(t):
        r'"[^"]*"'
        t.value = t.value[1:-1] # drop "surrounding quotes"
        print 'MyString:',t.value
        return t

def t_WORD(t):
        r'[^ <>\n]+'
        print 'MyWord:',t.value
        return t




webpage = "cout<<\"Hello World\"; // this comment"
htmllexer = lex.lex()
htmllexer.input(webpage)
while True:
        tok = htmllexer.token()
        if not tok: break
        print tok

问候

4

2 回答 2

1

刚刚想通了。正如我将评论状态定义为exclusive,它不会使用inclusive状态模块(如果评论模块定义在顶部,否则它会出于某种原因使用它)。因此,您将再次为评论状态重新定义所有模块。因此ply提供了error()模块,用于跳过未定义特定模块的字符。

于 2014-03-27T21:17:40.370 回答
0

这是因为您没有接受的规则,this或者comment 实际上您不关心评论中的内容,您可以轻松地做类似的事情

t_cppcomment_ANYTHING = '[^\r\n]'

就在你的t_ignore规则之下

于 2014-03-27T20:58:59.983 回答