простой синтаксический анализатор - зачем вызывать `синтаксическую ошибку`, когда len (токены) больше 0? - PullRequest
0 голосов
/ 25 июня 2018

Я читаю на простом переводчике языка калькулятора.Размещение всего кода здесь не имеет смысла.Просто тот раздел, который важен, насколько я знаю.В приведенной ниже функции '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 - синтаксический анализатор

где -

Сначала лексический анализатор разбивает входную строку на токены, которые являются минимальными синтаксическими единицами языка, такими как имена и символы.Во-вторых, синтаксический анализатор создает дерево выражений из этой последовательности токенов.

1 Ответ

0 голосов
/ 25 июня 2018

Основано на комментарии DanielRoseman :

Список токенов изменяется вне функции tokenize с использованием analyze;после чего, если условие хорошее.

Вы не показываете код для анализа (), но я предполагаю, что он изменяет свой аргумент - то есть он удаляет все записи из токенов, когда анализирует их, и если они еще осталисьпосле возвращения это должно быть синтаксической ошибкой.- Даниэль Роузман

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...