Я читаю на простом переводчике языка калькулятора.Размещение всего кода здесь не имеет смысла.Просто тот раздел, который важен, насколько я знаю.В приведенной ниже функции 'SyntaxError'
повышается, когда len(tokens)
больше 0. Это не имеет смысла для меня, потому что токены всегда должны иметь некоторую длину.Вторая функция - это функция токенизатора, которая принимает входное выражение и генерирует список токенов.Как видно из примера, длина не равна нулю.Ниже приведен небольшой глоссарий -
def calc_parse(line):
"""Parse a line of calculator input and return an expression tree."""
tokens = tokenize(line)
expression_tree = analyze(tokens)
if len(tokens) > 0: #why would length of tokens be 0?
raise SyntaxError('Extra token(s): ' + ' '.join(tokens))
return expression_tree
def tokenize(line):
"""Convert a string into a list of tokens."""
spaced = line.replace('(',' ( ').replace(')',' ) ').replace(',', ' , ')
return spaced.split()
tokenize('add(2, mul(4, 6))')
#['add', '(', '2', ',', 'mul', '(', '4', ',', '6', ')', ')']
len (tokenize('add(2, mul(4, 6))'))
#11
- func
tokenizer
- лексический анализатор - func
analyze
- синтаксический анализатор
где -
Сначала лексический анализатор разбивает входную строку на токены, которые являются минимальными синтаксическими единицами языка, такими как имена и символы.Во-вторых, синтаксический анализатор создает дерево выражений из этой последовательности токенов.