发布
社区首页 >问答首页 >Ply :为"c“语言定义规则时出现问题

Ply :为"c“语言定义规则时出现问题
EN

Stack Overflow用户
提问于 2011-02-18 07:38:30
回答 1查看 1.1K关注 0票数 2

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

以下是我的规则:

表达式->表达式op表达式

expression -> ID

expression ->编号

语句-> ID赋值表达式

语句-> IF表达式THEN语句

语句-> WHILE表达式THEN语句

所有大写字母的东西都是一个令牌(终端符号)

在解析字符串"while h<=0 then t=1“时,它似乎将"h”视为一个表达式(使用规则表达式->ID)。因此,"WHILE expression THEN statement“中的表达式变成了"h”。显然,我希望它将"h<=0“作为表达式(使用规则表达式->表达式op表达式)。我如何确保发生这种情况?

EN

回答 1

Stack Overflow用户

发布于 2011-02-19 07:49:12

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

代码语言:javascript
代码运行次数:0
复制
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

代码片段的输出为:

代码语言:javascript
代码运行次数:0
复制
('while', ('<=', 'h', '0'), ('assign', 't', '1'))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5036082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档