git-subtree-dir: users/wpcarro git-subtree-mainline:464bbcb15cgit-subtree-split:24f5a642afChange-Id: I6105b3762b79126b3488359c95978cadb3efa789
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import random
 | |
| 
 | |
| # Write an evaluator for a small language:
 | |
| #   - operators: '+', '*'
 | |
| #   - operands:  Integers
 | |
| #
 | |
| # E.g. evaluate("2+14*90+5*16")
 | |
| 
 | |
| def tokenize(xs):
 | |
|     result = []
 | |
|     i = 0
 | |
|     while i < len(xs):
 | |
|         current = xs[i]
 | |
|         if current in {'*', '+'}:
 | |
|             result.append(current)
 | |
|             i += 1
 | |
|             continue
 | |
|         elif current == ' ':
 | |
|             i += 1
 | |
|             continue
 | |
|         else:
 | |
|             i += 1
 | |
|             while i < len(xs) and xs[i] in {str(x) for x in range(10)}:
 | |
|                 current += xs[i]
 | |
|                 i += 1
 | |
|             result.append(int(current))
 | |
|     return result
 | |
| 
 | |
| def ast(tokens):
 | |
|     result = []
 | |
|     series = []
 | |
|     for token in tokens:
 | |
|         if token == '+':
 | |
|             result.append(series)
 | |
|             series = []
 | |
|         elif token == '*':
 | |
|             continue
 | |
|         else:
 | |
|             series.append(token)
 | |
|     if series:
 | |
|         result.append(series)
 | |
|     return result
 | |
| 
 | |
| def product(xs):
 | |
|     result = 1
 | |
|     for x in xs:
 | |
|         result *= x
 | |
|     return result
 | |
| 
 | |
| def evaluate(x):
 | |
|     tokens = tokenize(x)
 | |
|     tree = ast(tokens)
 | |
|     return sum([product(xs) for xs in tree])
 | |
| 
 | |
| n = 7
 | |
| operands = [random.randint(0, 100) for _ in range(n)]
 | |
| operators = [random.choice(['+','*']) for _ in range(n - 1)]
 | |
| expr = []
 | |
| for i in range(n - 1):
 | |
|     expr.append(operands[i])
 | |
|     expr.append(operators[i])
 | |
| expr.append(operands[-1])
 | |
| 
 | |
| expr = ' '.join([str(x) for x in expr])
 | |
| print("Expression: {}".format(expr))
 | |
| print("Tokens: {}".format(tokenize(expr)))
 | |
| print("AST: {}".format(ast(tokenize(expr))))
 | |
| print("Answer: {}".format(evaluate(expr)))
 | |
| assert evaluate(expr) == eval(expr)
 | |
| print("Success!")
 |