Когда вы пишете программу на языке, самое первое, что должен сделать ваш интерпретатор/компилятор, чтобы перейти от последовательности символов к реальному действию, — это преобразовать эту последовательность символов в более сложную структуру. Для этого сначала он разбивает вашу программу на последовательность токенов, выражающих то, что представляет каждое «слово». Например, конструкция
if foo == 3: print 'hello'
будет преобразован в
1,0-1,2: NAME 'if'
1,3-1,6: NAME 'foo'
1,7-1,9: OP '=='
1,10-1,11: NUMBER '3'
1,11-1,12: OP ':'
1,13-1,18: NAME 'print'
1,19-1,26: STRING "'hello'"
2,0-2,0: ENDMARKER ''
Но обратите внимание, что даже что-то вроде «если бы если бы если» правильно превращается в токены.
1,0-1,2: NAME 'if'
1,3-1,5: NAME 'if'
1,6-1,8: NAME 'if'
1,9-1,11: NAME 'if'
2,0-2,0: ENDMARKER ''
За токенизацией следует анализ структуры более высокого уровня, которая анализирует, действительно ли токены имеют смысл вместе взятые, чего нет в последнем примере, но делает первый. Для этого синтаксический анализатор должен распознать фактическое значение токенов (например, if — это ключевое слово, а foo — переменная), затем построить дерево из токенов, организовав их в иерархию, и посмотреть, действительно ли эта иерархия создает смысл. Вот тут-то и появляется грамматика, которую вы видите. Эта грамматика находится в BNF, которая представляет собой нотацию для выражения конструкций, которые может распознать язык. Эта грамматика переваривается программой (например, bison), которая обладает волшебным свойством брать эту грамматику и генерировать фактический код C, который делает за вас тяжелую работу, обычно распознавая токены, организуя их, возвращая вам дерево синтаксического анализа, или сказать вам, где есть ошибка.
Краткая версия: разработка языка заключается в определении токенов и о том, как эти токены объединяются, чтобы дать что-то значимое. Это делается с помощью грамматики, которую вы используете для создания фактического кода «парсера» с помощью автоматизированных инструментов.
person
Stefano Borini
schedule
19.12.2013