Ply:定义“c”语言规则时出现问题

时间:2011-02-17 23:38:30

标签: parsing yacc ply

我试图为c语言编写解析器,它将能够处理表达式,赋值,if-else和while循环。

这是我的规则:

表达 - >表达式op表达式 表达 - > ID
表达 - > NUMBER
声明 - > ID ASSIGN表达式
声明 - > IF表达THEN声明
声明 - > WHILE表达THEN语句

大写字母中的所有内容都是令牌(终端符号)

当解析字符串&#34;而h <= 0然后t = 1&#34;时,它似乎考虑&#34; h&#34;作为表达式(使用规则表达式 - &gt; ID)。所以,表达式是&#34; WHILE表达式THEN语句&#34;成为&#34; h&#34;。显然,我希望它考虑&#34; h&lt; = 0&#34;作为表达式(使用规则表达式 - &gt;表达式op表达式)。我如何确保这种情况发生?

1 个答案:

答案 0 :(得分:1)

在您询问ply.lex模块的previous post的基础上,下面的代码片段似乎是类似c语法的部分实现。我没有太多使用ply,但其中一个技巧似乎是你需要以正确的顺序定义语法规则。

tokens   = [ 'ID', 'NUMBER', 'LESSEQUAL', 'ASSIGN' ]
reserved = {
    'while' : 'WHILE',
    'then'  : 'THEN',
    'if'    : 'IF'
}
tokens += reserved.values()

t_ignore    = ' \t'
t_NUMBER    = r'\d+'
t_LESSEQUAL = r'<='
t_ASSIGN    = r'\='

def t_ID(t):
    r'[a-zA-Z_][a-zA-Z0-9_]*'
    if t.value in reserved:
        t.type = reserved[ t.value ]
    return t

def t_error(t):
    print 'Illegal character'
    t.lexer.skip(1)

def p_statement_assign(p):
    'statement : ID ASSIGN expression'
    p[0] = ('assign', p[1], p[3] )

def p_statement_if(p):
    'statement : IF expression THEN statement'
    p[0] = ('if', p[2], p[4] )

def p_statement_while(p):
    'statement : WHILE expression THEN statement'
    p[0] = ('while', p[2], p[4] )

def p_expression_simple(p):
    '''expression : ID
                  | NUMBER'''
    p[0] = p[1]

def p_expression_cmp(p):
    'expression : expression LESSEQUAL expression'
    p[0] = ( '<=', p[1], p[3] )

import ply.lex as lex
import ply.yacc as yacc
lexer = lex.lex()
parser = yacc.yacc()
inp = 'while h<=0 then t=1'
res = parser.parse(inp)
print res

摘录的输出是:

('while', ('<=', 'h', '0'), ('assign', 't', '1'))