【问题标题】:Ply : problem while defining rules for the "c" languagePly:定义“c”语言规则时的问题
【发布时间】:2011-02-17 23:38:29
【问题描述】:

我正在尝试为 c 语言编写一个解析器,它能够处理表达式、赋值、if-else 和 while 循环。

这是我的规则:

表达式 -> 表达式操作表达式
表达式 -> ID
表达式 -> NUMBER
语句 -> ID ASSIGN 表达式
语句 -> IF 表达式 THEN 语句
语句 -> WHILE 表达式 THEN 语句

大写的一切都是一个标记(终端符号)

解析字符串“while hID)。因此,“WHILE 表达式 THEN 语句”中的表达式变为“h”。显然,我希望它考虑“h 表达式 op 表达式)。我如何确保发生这种情况?

【问题讨论】:

  • 它是否正确解析while h<0 then t=1< 而不是<=)?如果是,您忘记在 lex 中定义标记。
  • 好吧,我刚刚发现它实际上在做我想做的事.. 我检测它使用的规则的方法有点错误!
  • FWIW,"while h
  • 是的,我正在研究更多的“类 c 语言”

标签: parsing yacc ply


【解决方案1】:

在您询问 ply.lex 模块的 previous post 的基础上,下面的 sn-p 似乎是类 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

sn-p 的输出是:

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

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2020-10-16
    • 2010-10-04
    • 2010-09-07
    相关资源
    最近更新 更多