Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по конечным автоматам   Найти похожие ветки 

 
Ломброзо ©   (2006-01-19 22:07) [0]

...то есть по GOLD парсер, на который меня любезно натравили unknown и Паша Голубь.
Как работает конечный автомат я в общих чертах представляю, но возникли сложности с пониманием терминологии Gold Parser, и, как следствие, алгоритма разбора дерева, получаемого на выходе работы парсера.

Итак, я понял, что два самых главных события, на которые я должен отреагировать во время работы парсера - это чтение лексемы (Token) и - второе - т.н. Reduction (в терминологии Gold Parser).
Вот что такое Reduction? Если можно, объясните, пожалуйста, на пальцах.


 
TUser ©   (2006-01-19 22:26) [1]

Может правило ("сведЕние") в форме БН?, Т.е.
default_type ::= char|int|....

reduction 1) редукция; уменьшение; сокращение 2) предварительная обработка; предварительное преобразование, сжатие ( данных ) 3) превращение; приведение; сведение ( к чему-л. ); упрощение • - data reduction - graphic data reduction - industrial data reduction - innermost reduction - mission data reduction - network data reduction - network reduction - off-line data reduction - on-line data reduction - outermost reduction - priority data reduction - real-time data reduction - rowwise reduction - search reduction - variety reduction


 
Ломброзо ©   (2006-01-19 22:32) [2]

>Может правило ("сведЕние")
Во-во, близко, в исходных кодах встречается фраза Reduction Rule. И это самое событие возникает в промежутке между событиями Token Read - когда парсер на запятую натыкается между идентификаторами, или ключевое слово встретилось... А вот закономерности уловить не могу.

Электронный переводчик у меня тоже есть, между прочим.


 
Mystic ©   (2006-01-19 23:01) [3]

Ты понимаешь различие между восходящими и нисходящими схемами разбора?

При восходящей схеме выполняется два типа операций с потоком лексем: сдвиг (shift) и свертка (reduce). Например, рассмотрим входной поток

type TA = class(Exception) end;

для грамматики (жирным выделены слова)

type : type id = class inherited end ;
 interited : /* пусто */
             | ( id interface_list )
 interface_list : /*пусто */
                   | , id interface_list


 
Mystic ©   (2006-01-19 23:13) [4]

Лексема:  type (нет правило, кидаем лексему в стек)
Стек type
Shift

Лексема TA (нет правила)
Стек type TA
Shift

Лексема = (нет правила)
Стек type TA =
Shift

Лексема class (не правила)
Стек type TA = class
Shift

Лексема ( (неп правила)
Стек type TA = class (
Shift

Лексема Exception (нет правила)
Стек type TA = class ( Exception
Shift

Лексема )
Правило interface_list: /*пусто*/
Стек до type TA = class ( Exception )
Стек после type TA = class ( Exception interface_list )
Reduce

Правило inherited: (id interface_list )
Стек до type TA = class ( Exception interface_list )
Стек type TA = class interface_list
Reduce

Лексема end
Стек type TA = class interface_list end
Shift

Лексема ;
Правило type : type id = class inherited end ;
Стек type
Reduce

Соответственно при чтении лексем может быть либо ситуация shift, либо reduce. Если возможно несколько shift, то происходит shift --- нет проблем. А вот если возникает возможность shift и reduce (или reduce и reduce), то часть парсеров не разруливают таких проблем, точнее YACC выдает информацию о конфликте и выбирает решение в пользу следования более раннему правилу


 
Mystic ©   (2006-01-19 23:15) [5]

Там опечатка в последних трех имеется в виду inherited вместо interface_list
:(


 
Mike Kouzmine ©   (2006-01-19 23:22) [6]

Mystic ©   (19.01.06 23:13) [4] На первый взгляд shift и reduce не должно вызывать проблем, а вот reduce и reduce - очень даже.


 
Ломброзо ©   (2006-01-19 23:58) [7]

Mystic ©

Ага, спасибо, кажется понял. Поправьте если что:

Иными словами, если представить себе дерево, то reduce - это операция, протвиоположная shift; reduce сигнализирует о том, что был произведён обход ветви, парсер готов к обходу следующей ветви, а разработчик должен проанализировать стек лексем?


 
Mystic ©   (2006-01-20 12:59) [8]

> На первый взгляд shift и reduce не должно вызывать проблем,
>  а вот reduce и reduce - очень даже.


Ну... теоретически проблему избежать возможно (надо заглянуть, какие лексемы идут следующими и в зависимости от этого выполнять либо reduce, либо shift). Но это (опять же теоретически) может привести у усложнению конечного автомата, реализующего такую логику. Если, например, количество состояний автомата, который в случае shirt/reduce конфликта выбирает первый путь, примерно O(N), где N --- количество правил, то у такого автомата, как описали вы, будет O(N^2) . Точные значения я не помню. Ряд генераторов синтаксических анализаторов в состоянии решить этот конфликт, часть --- нет.

> Ломброзо ©   (19.01.06 23:58) [7]

Ну.. не совсем понял терминологии... Reduce говорит о том, что для последних лексем в стеке можно применить одно из правил. И заменяет набор лексем на новую лексему согласно правилу. А Shift просто читает новую лексему из списке лексем.


 
Ломброзо ©   (2006-01-20 13:04) [9]

> Reduce говорит о том, что для последних лексем в стеке можно применить одно из правил

Ну да, примерно так я и понял. Спасибо.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.04 c
15-1138081406
wHammer
2006-01-24 08:43
2006.02.12
Большие целые числа (Delphi 5)


2-1138250846
Doctor DOOM
2006-01-26 07:47
2006.02.12
ООП - Как создать собственный объект для формы?


15-1137442466
Гарри Поттер
2006-01-16 23:14
2006.02.12
Рисовалки


2-1138107504
stels
2006-01-24 15:58
2006.02.12
проверка Edit на пустоту


2-1138086297
YDS
2006-01-24 10:04
2006.02.12
Прозрачность фона картинки для BitBtn





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский