parsing - thickness: 为"c" 语言定义规则时出现问题

  显示原文与译文双语对照的内容
0 0

我试图为c 语言编写一个解析器,它可以处理表达式,赋值,如果其他的,或者循环。

以下是我的规则:

表达式-> 表达式运算表达式
表达式-> ID
表达式-> 号
语句-> ID分配表达式
语句-> 如果表达式则为语句
语句-> 而表达式语句

caps中的所有内容都是令牌( 终端符号)

在解析字符串"h <=0然后 t=1"时,它似乎认为"h"是表达式( 使用规则 expression-> ID ) 。 因此,"而表达式则声明"中的表达式变成"h"。 显然,我希望它认为"h <=0"是表达式( 使用规则表达式-> 表达式运算表达式) 。 我怎么才能保证?

时间: 原作者:

0 0

大楼以前的文章你在哪里询问 ply.lex 模块,下面的代码片段似乎是一个部分实现c的语法。 我没有使用铺层,但其中一个技巧似乎是你需要在正确的顺序中定义语法规则。


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'))

原作者:
...