<p>这是一个起点:</p>
<pre><code>from ply import lex
from ply import yacc
# lexer
tokens = ('OPEN_PAREN', 'NUMBER', 'CLOSE_PAREN', 'ADD', 'SUB', 'MUL', 'DIV')
t_OPEN_PAREN = r'\('
t_NUMBER = r'\d+\.\d+'
t_CLOSE_PAREN = r'\)'
t_ADD = r'\+'
t_SUB = r'-'
t_MUL = r'\*'
t_DIV = r'/'
t_ignore = ' \t'
# parser
def p_expression_add(p):
'expression : expression ADD term'
p[0] = ('+', p[1], p[3])
def p_expression_sub(p):
'expression : expression SUB term'
p[0] = ('-', p[1], p[3])
def p_expression_term(p):
'expression : term'
p[0] = p[1]
def p_term_mul(p):
'term : term MUL factor'
p[0] = ('*', p[1], p[3])
def p_term_div(p):
'term : term DIV factor'
p[0] = ('/', p[1], p[3])
def p_term_factor(p):
'term : factor'
p[0] = p[1]
def p_factor(p):
'factor : OPEN_PAREN number ADD DIV SUB number CLOSE_PAREN'
p[0] = (p[2], p[6])
def p_number(p):
'number : NUMBER'
p[0] = float(p[1])
# oh, and handle errors
def p_error(p):
raise SyntaxError("Syntax error in input on line %d" % lex.lexer.lineno)
def parse(input):
'''
parses a string with the contents of the idf file and returns the dictionary
representation.
'''
lexer = lex.lex(debug=True)
lexer.input(input)
parser = yacc.yacc()
result = parser.parse(debug=True)
return result
if __name__ == '__main__':
#result = parse('(18.13053098972887 +/- 0.9408208676613867)')
result = parse('(18.13053098972887 +/- 0.9408208676613867) + (4.198532451786269 +/- 1.006181051488966)')
print result
</code></pre>
<p>这个脚本将产生以下输出:(注意,我剥离了调试输出)</p>
<pre><code>('+', (18.13053098972887, 0.9408208676613867), (4.198532451786269, 1.006181051488966))
</code></pre>
<p>接下来的步骤是:</p>
<ul>
<li>扩展解析器以每行处理多个表达式
<ul>
<li>您可能希望定义语义比在您的问题中更好一点</li>
</ul></li>
<li>检查结果并解释
<ul>
<li>增加不确定性如何影响结果?你知道吗</li>
</ul></li>
</ul>
<p>您还可以使用解析器来进行计算,例如,如果添加不确定的数字与添加它们的值和不确定度是相同的:</p>
<pre><code>def p_expression_add(p):
'expression : expression ADD term'
p[0] = (p[1][0] + p[3][0], p[1][1] + p[3][1])
</code></pre>
<p>如果您这样替换<code>p_expression_add</code>,那么生成的答案将是:</p>
<pre><code>(22.32906344151514, 1.9470019191503527)
</code></pre>
<p>玩得开心!像这样简单的解析是一个非常有用的工具,您可以随意使用,因为很多棘手的问题在被看作解析问题时会变得更容易。你知道吗</p>