Искусство программирования на Си (984073), страница 60
Текст из файла (страница 60)
Именно это подмножество правил будет второго выражения, которое в 2 раза длиннее пер- описании языка А!Во) 60. БНФ допускает несколько Один из способов, позволяюших понять выражение, испольюввно при написании примера кода, рассматривого, не лолжна превышать по времени компиляцию различныл способов записи, однако далее в этой главе состоит в том, чтобы взять копию определения КАК и ваемого в этой главе. первого выражения более чсч в 2 раза, поскольку будет использована нотация, несколько отличаюшаяся построить с ее помошью синтаксическую диаграмму Синтакси <ескос обозначение, пспольюванное в согласование этого процесса во времени должно по от той, какая использ>ется в опредеденип Ко<К. выражения.
Если начать анализ с выражения этом подмножестве правил, оказывается более компаквозможности подчиняться линейному закону.. Ка,кдос правило синтаксиса имеет свое ил<я <нан<е). тным, чел< описанное выше обозначение БНФ, приме- Ь * с2 + ну* ° ?он<<оса<ь. Несмотря на то что обнаруживать ошиб Оно <вписывается в первой строке с последуюшим дво- няемос в официальном определении (Ко<К) данного ки нео<лодпмо, это отнюдь не означает, по пра- с сточием. В каждой последующей строке указывается то можно было бы рассуждать следуюшим образом.
Это языка. В этом обозначении альтернативы разделяются вильные выра кения требуется отмечать как нспра- аныяернаошво (айегиа<е). Каждая альтернатива состоит выражение состоит из пяти отдельных обозначении: вертикальнои чертой ()), а не размешаются в отдельныл вильныс нлн нспрзвильныс выраж< ния как из послсловательности элементов, которые, в свою оче трех идентификаторов Ь, с2 и лус, а также дв>х бинар- строках. Определяемое ил<я отделяется от своего опрепрввильные.
а самом деле требуется созлать код рель, являются либо символьной строкой (это означа- ных арифметических операторов: * и +. При этом зна- деления двумя двоеточиями и знаком равенства (л=), а для вычисления выражения, которь<й соответствовал ет, что каждый символ лолжен присутствовать в анали- чениеЬ умножается на значение с2, а произведение этих не одним лишь лвоеточием, причем каждое правило дино~и кенлныгтеиитичегкигрнхж ы Г) чтиакгичскии анализ и вычиснгниг ннразкении $ Часть 1и Глава 19 них-г)ж)1 л= Й№п ( иррег-иех-гткн( 1оиег-лех-г)тгг ) ных определений С, которые оказываются более обшир иметь возможность разделить ее на подстроки, чтобы иррег-Бех-ьав11 л= "А" ! "В" ) "С" ( "0" ! "Е" ( "Е' № нылчи,несли быонииспользовались,тосоответствуюший было ясно, где идентификатор, где выражение сложекод получился бы нал1ного длиннее.
Расширение такого ния и т.д. В качестве примера рассмотрим следуюшее кода до полных опрелелений не вызывает особых татр>д- выражение: езсарег1-с№агасгег л= "чч" етсаре-тециепге № ненигп олн'ко о ранич н й объе астояшей и не ь„а+ Ь*с2+хуе елгаре-леоиепсе "= "и" ! "1" ! 'У'! Ъ" ( "г" ( "д" ( "а" ) -Л" ) "?" ) "'" ! ост1 71.:н11 позволяет этого сделать. кроме того, класс гггепгучег 1№денОргтна1-пега!-Йрг Орггана1-Оега1-№т11 ~ "Х" Гик-511и11 №ЕХЧ1М11 № тификапюр) не может начинаться с символа подчерки- Если пронлмеровать каждый из этих силчволов слегпгелег-соптгапг х= Й211 т1ецег-сопжат 1 гук11 № ванна Он должен начинаться с буквы. Кроме того, из дуюшим образом: этого синтаксиса >далены массивы и указатели 0 Ь Яоаг!оа-сопггапг х= Гпгелег-рагг 1гасггоп-рагг Е-рагг ехропгпг Г-раг1 № Такой 1сокрашенныи) синтаксис также предполша- 1 т1ееег-рагг х= тгекег-соплапг ~ евро № ет предварительное удаление всех лишних пробелов из 2 с /гас1гап-рпП .:= ртпг гпгехег-рагГ ~ етр1у № анализируемого текста таким образом, чтобы он не со- 3 2 рогпг х= "." № держал символов пробела, новой строки, табуляции, 4 перевода формата или комментариев.
5 Е-раг1 х= "е" 1 "Е" 1 етргу № 6 > г-рагГ х= "Г ) "р" ( "Г ) "Е" ! етргу № Синтаксический анализ (без рассмотрения ошибок) 7 ехропет х= оряопа1-лаан т1ецег-соптгат ~ етргу № Во время анализа строки силгволов, котоРая, как пред- то в пропессе синтаксического анализа получилась бы ор1гопа1-5ап х= + ~ ~ стулу № полагается, может оказаться выражением, необходимо информапия, привеленная в табл. 19.1. 2(инплниннслнныс те мати нсскис ри кжкы Гитпикитсскии ини тз и им ниснснпс нырахссни и ! ~ Часть Гй Глава 19 На рис. 19.1 представлена диаграмма синтаксичес- Прил!ерно такой порядок анализа приведен в табл.
19.1. сначата первую алыернативу, а если и она не ласт же- перечислены в табл. 19.2 (некоторые из ннх отмечены кого анализа. Подобные диаграммы мог>т быть та«» с В этол! случае рассужление начинается со слелуюшего ласмого рез>льтата. тогда уже становится ясно, что оп- двойным вопросительным знаком как сомнительные). нарисованы в виде древовидных структур (рис.
19.2). предполокения: "После этой б>квы следует другая бук- робование второй альтернативы не имеет смысла. Испольюванис сомнительных операций приводит к Оба >казанных рисунка сл>жат графическим представ- ва. Возможно, это идентификатор. Это иденп!фикатор, К кажлои альтернативе может быть добавлено две генерированию более короткого кода, хотя абсолютной пением табл.
19.1. после которого слелует знак умножения, а затем еше разреженные таблицы типа "Должно содержать" и "С необходимости в этол! нет. В конце вычисления требуНесмотря на то что дерево, приведенное на рис. 19.2, один идентификатор, поэтому это может быть выраже- чего может начинаться". В таблице "Должно содержать" ется, чтобы первый аккумулятор содержал полученное оказывается намного проще для понимания, чем при- ние", и так рассуждение продвигается далее в направ- указывается, что именно следовало определгпь лак значение, тогда как значение инлексного регистра опять веденная выше таблица, тел! не менее в рассматривае- ленин "выражения", которое хны собственно и пытаем- встретившееся в следуюшем тексте на предыдуших эта- должно быть равно н>лю мом здесь примере кода предпочтение будет отдавать- ся распознать.
Если во входном тексте имеется ошибка пах синтаксического или лексического анализа, если В качестве примера применения только >казанных ся получению именно полобной таблицы и он не соответствует вознкожнон!у синтаксису, тогда данная конкретная альтернатива ласт желаемый резуль- выше операций рассмотрил! вычисление след> юшсго этот факт обнаруживается как мокно ранее и обычно тат Таким образом, лля второй альтернативы условно- выра, кения: Ь 1 4 7 !О 13 16 17 19 расценивается как весьма близкий к ошибке в тексте. го выражения в таблице "Должно содержать" б>дет, по Ь * е2 + хух с 2 5 й 11 14 При нисхпдящем синтаксическом анализе <спр-диан краиней мере, >катано, что в последующем тексте дол- 2 расмпя) просмотр начинается с той части синтаксиса, жны прис>тствовать сил!волы "7' и ":".
+ > 20 21 22 23 и т д которую требуется в конечном счете распознать (ч го и Таблица "С чего можег начинаться" таюхс представ- дд хl является конечной целью анализа), а затем мы посте- ляет собой разрез енный массив, причем в нем указы- л2 = с2; у 3 б 9 12 15 18 пенно переходим ниже в направлении отдельных сим- ваются тс символы и синтаксические классы, когорые Д! = й1 * Х2; волов текста.
Иногда такой подход означает прослютр могут встретиться в начале любой альтернативы. Это Д2 = хух; л! х дз + кг! Яапа <чин<елен<ее п< ем а с<ические ра <деза Сене<сесин<сечи анализ и енчнс<ение сара<сепий т 1 Часть П1 Глава 19 А2 = д< степени связности [операндов) устанавливается в соот- вынужденно использовать все три клавиши переклю <е- Звтрквить а в аккуитлятор А1 А1 = А1 + А2; ветствии с таблицей порядка старшинства операций, ния регистра [старая, с грохотом работавшая пнш>'шая поместить в стек солеривиое акктитлЯтойа А1 атаск([вдехче) = А1; Эагрузвть Ь в ахкуиулятор А1 А1 = а; приведенной па с. 53 второго издания книги Кай.
Из машинка часто заедала при переклю <енин регистров), Поиествть в стек содеривиое аккумулятора А1 А2 = Ь; этой таблицы след>ет, например, но операторы учно- Лукашевич изобРел запись, которая не требовала при- извлечь вз стека и поместить в аккумулятор А2 11 (А)>А2) Пото Ы; женил вычисляются слева направо, а оператор >словил менення скобок. Д <я этого обычная запись операнд апе- взвлечь вз стека в воиествть в аккумулятор А1 А1 = атаск[твдех--)< ? — справа налево. да<пар опеРанд была заменена на запись лиера<пал операнд Выполнить уивоиеиве А2 = атаск[1влех — ); Чтобы придать всему этому какой-то смысл, нерелко операнд. Таким образом, обычная запись А + В превра- Поместить в стек солерквиое акхуяупятора А) доха П2< тилась в мнись + 4В Ы< используется так называемая ппяьгная нотация (Рай<А Поместить в стек содерквиое аккумулятора А1 па<а«ап), которая рассматривается в следуюшем разделе.