ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » планирование » Яр молчит уже 53-ий день, я волнуюсь.


Яр молчит уже 53-ий день, я волнуюсь.

Сообщений 1 страница 16 из 16

1

Последний публично озвученный план развития сообщества как сообщества был такой:
1) написать программу-калькулятор (кстати, не очень понятно, что тут имелось в виду) на русском языке программирования
2) после этого начать широкую компанию в интернете по привлечению новых людей на форум.

Тут у меня два вопроса:
1) зачем нужен калькулятор и нельзя ли начать привлекать людей сразу, до его написания
2) зачем нужен калькулятор сам-по-себе?

Написать калькулятор можно, например на языке КуМир, всё там для этого есть, вроде бы.
Написать на бумажке грамматику разбираемых выражений, устранить левую рекурсию, пострить детерминированный МП-автомат по грамматике (это то, что делает утилита yacc, и называется LALR, но ничто не мешает проделать это руками).
Стек расширенного МП-автомата можно сэмулировать при помощи массива, а больше, вроде бы ничего и не нужно.

Такую программу можно запустить на web, вот проект по этому поводу:
https://github.com/axelofan/kumir
"Программа пишется на школьном алгоритмическом языке, затем транслируется в JS код и исполняется в браузере."

Отредактировано Лис (2017-09-06 10:41:57)

0

2

Яр молчит уже 53-ий день, я волнуюсь.

Он, кажется, писал, что летом будет в отпуске.
Надо вернутся к вопросу парсинга с этих движков. Инженер вроде что-то делал.

Лис написал(а):

1) написать программу-калькулятор (кстати, не очень понятно, что тут имелось в виду) на русском языке программирования

Лис написал(а):

2) зачем нужен калькулятор сам-по-себе?

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

0

3

MihalNik написал(а):

Надо вернутся к вопросу парсинга с этих движков.

Работой по сохранению полезного контента в интернете занимается web.archive.org
Если Вам особо понравилась какая-то страница, можно принудить его к сохранению состояния на текущий момент,
указав URL, который надо сохранить.

Если кто-то напишет нетленку, он может её сохранить в git-репозиториях, их много (github, bitbucket и другие), таким образом можно обспечить резервирование.

Зачем нужен парсинг форумов? Просто потому что мы можем?

Отредактировано Лис (2017-09-06 11:45:40)

0

4

Лис написал(а):

Написать на бумажке грамматику разбираемых выражений

Грамматика Г это четвёрка <Н, Т, С, П>, где Н - это множество нетерминальных символов, Т - это множество терминальных символов, С - это стартовый символ, П - это множество правил вывода.

Нетерминальные символы Н = {н1,н2,н3,н4,н5}

Запишем терминалы для калькулятора Т={т123,...,т7}:
т1 = '+'
т2 = '-'
т3 = '*'
т4 = '/'
т5 = '('
т6 = ')'
т7 = '1'

Стартовый символ С = { н1 } (тут есть варианты, стартовый символ может быть один, а может быть несколько, если алгоритм типа CYK)

Запишем правила вывода для калькулятора П = {п1,п2,п3,...,п14}, где
п1: н1 -> н2
п2: н1 -> н3
п3: н2 -> н4
п4: н2 -> н4 н5
п5: н3 -> т1 н2
п6: н3 -> т2 н2
п7: н3 -> т1 н2 н3
п8: н3 -> т2 н2 н3
п9: н4 -> т3 н5
п10: н4 -> т4 н5
п11: н4 -> т3 н5 н4
п12: н4 -> т4 н5 н4
п13: н5 -> т5 н1 т6
п14: н5 -> т7

0

5

устранить левую рекурсию

читаем это - https://neerc.ifmo.ru/wiki/index.php?title=Устранение_левой_рекурсии

Упорядочим нетерминалы, например по возрастанию индексов, и будем добиваться того, чтобы не было правил вида
ни -> нк остаток правила, где к < и

у нас таких правил нет, значит левая рекурсия устранена.

0

6

Лис написал(а):

пострить детерминированный МП-автомат по грамматике

Читаем алгоритм 5.3 с этой страницы - https://studfiles.net/preview/4599551/page:11/

расширенный МП-автомат А это семёрка <Т, Ш, М, Х, сcа, Ф, Д>, где
Т - это множество символов входного алфавита
Ш - это символы, которые могут встречаться на стеке (терминалы и нетерминалы из грамматики выше, всего 7 + 14 = 21)
М - множество состояний автомата
Х - функция переходов, которая по текущей ситуации {м, т, ш*} выдаёт следующее состояние <м', ш'>
      (расширенным этот автомат является, потому что он в стеке проверяет наличие цепочки символов стека, а не только одного)
сcа - стартовое состояние автомата
Ф - множество заключительных/конечных состояний автомата
Д - начальный символ в стеке

Состояний у автомата будет два: М = {р, з} - рабочее и завершающее

Функция переходов проверяет,
не находится ли на стеке правая часть какого-нибудь правила (если да, то производит свёртку)
если на стеке пара <Д, С> и символы закончились, то переходит в конечное состояние,
иначе кладёт терминал на стек и удаляет терминал из входного потока (выполняет сдвиг).

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

0

7

Тут внезапно обнаруживаются две вещи:
1) для LR-парсеров можно было не устранять левую рекурсию
а это нужно для сохранения ассоциативности операций,
потому что мы пишем не Recursive Descent-парсер, и хвостовая рекурсия не может быть заменена циклом
так что грамматику надо будет написать ещё раз.
2) таблицы при генерировании сжимаются,
примерно так:
https://www.cs.uic.edu/~spopuri/cparser.html#table-compression
обратите внимание, что англичане не поленились и проделали составление таблиц руками.

Новая грамматика (точнее только правила для неё):
п1: н1 -> н2
п2: н1 -> н3
п3: н2 -> н4
п4: н2 -> н2 т1 н4
п5: н2 -> н2 т2 н4
п6: н3 -> н5
п7: н3 -> н3 т1 н4
п8: н3 -> н3 т2 н4
п9: н4 -> н6
п10: н4 -> н4 т3 н6
п11: н4 -> н4 т4 н6
п12: н5 -> т2 н6
п13: н5 -> н5 т3 н6
п14: н5 -> н5 т4 н6
п15: н6 ->  т7
п16: н6 ->  т5 н1 т6

Отредактировано Лис (2017-09-06 20:26:05)

0

8

Лис написал(а):

Зачем нужен парсинг форумов? Просто потому что мы можем?

Нет. Потому что часть страниц закрыта от чтения без рег-ции.

Вопрос тот же:
Каким боком поделка 4-7 к русскому языку, что считать калькулятором и какой калькулятор нужен?
Например, давал ссылку. где был спрос на эффективную длинную (не наивную) арифметику.
Т.е. потребность в хорошем средстве по-прежнему есть.

Отредактировано MihalNik (2017-09-06 21:16:47)

0

9

MihalNik написал(а):

часть страниц закрыта от чтения без рег-ции

Это плохие, не нужные всем людям России страницы. Если бы это были хорошие страницы, они были бы доступными для чтения.

MihalNik написал(а):

Вопрос тот же:
Каким боком поделка 4-7 к русскому языку, что считать калькулятором и какой калькулятор нужен?

Я первый спросил!

MihalNik написал(а):

Например, давал ссылку. где был спрос на эффективную длинную (не наивную) арифметику.
Т.е. потребность в хорошем средстве по-прежнему есть.

Лично у меня такой потребности нет, я не пользуюсь длинными числами. Кому надо - тот и делает!

0

10

https://en.wikipedia.org/wiki/LR_parser … tween_them

Ситуация - это Earley Item, то есть запись некоего правила с точкой (Earley Dot = •) внутри него

Группа ситуаций - несколько ситуаций, по каким-то причинам объединённых в одну группу.

Итак, составим список групп ситуаций (он же будет списком состояний ДКА).

Состояние {1}
$accept -> • н1 $кон
+ н1 -> • н2
+ н1 -> • н3
+ н2 -> • н4
+ н2 -> • н2 т1 н4
+ н2 -> • н2 т2 н4
+ н3 -> • н5
+ н3 -> • н3 т1 н4
+ н3 -> • н3 т2 н4
+ н4 -> • н6
+ н4 -> • н4 т3 н6
+ н4 -> • н4 т4 н6
+ н5 -> • т2 н6
+ н5 -> • н5 т3 н6
+ н5 -> • н5 т4 н6
+ н6 -> • т7
+ н6 -> • т5 н1 т6
Следующие символы: т2{2}, т5{3}, т7{4}, н1{5}, н2{6}, н3{7}, н4{8}, н5{9}, н6{10}

Состояние {2}
н5 -> т2 • н6
+ н6 -> • т7
+ н6 -> • т5 н1 т6
Следующие символы: т5{3}, т7{4}, н6{11}

Состояние {3}
н6 -> т5 • н1 т6
+ н1 -> • н2
+ н1 -> • н3
+ н2 -> • н4
+ н2 -> • н2 т1 н4
+ н2 -> • н2 т2 н4
+ н3 -> • н5
+ н3 -> • н3 т1 н4
+ н3 -> • н3 т2 н4
+ н4 -> • н6
+ н4 -> • н4 т3 н6
+ н4 -> • н4 т4 н6
+ н5 -> • т2 н6
+ н5 -> • н5 т3 н6
+ н5 -> • н5 т4 н6
+ н6 -> • т7
+ н6 -> • т5 н1 т6
Следующие символы: т2{2}, т5{3}, т7{4}, н1{12}, н2{6}, н3{7}, н4{8}, н5{9}, н6{10}

Состояние {4}
н6 -> т7

Состояние {5}
$accept -> н1 • $кон

Состояние {6}
н1 -> н2
н2 -> н2 • т1 н4
н2 -> н2 • т2 н4
Следующие символы: т1{14}, т2{15}

Состояние {7}
н1 -> н3
н3 -> н3 • т1 н4
н3 -> н3 • т2 н4
Следующие символы: т1{22}, т2{23}

Состояние {8}
н2 -> н4
н4 -> н4 • т3 н6
н4 -> н4 • т4 н6
Следующие символы: т3{17}, т4{18}

Состояние {9}
н3 -> н5
н5 -> н5 • т3 н6
н5 -> н5 • т4 н6
Следующие символы: т3{26}, т4{27}

Состояние {10}
н4 -> н6

Состояние {11}
н5 -> т2 н6

Состояние {12}
н6 -> т5 н1 • т6
Следующие символы: т6{13}

Состояние {13}
н6 -> т5 н1 т6

Состояние {14}
н2 -> н2 т1 • н4
+ н4 -> • н6
+ н4 -> • н4 т3 н6
+ н4 -> • н4 т4 н6
+ н6 -> • т7
+ н6 -> • т5 н1 т6
Следующие символы: т5{3}, т7{4}, н4{16}, н6{10}

Состояние {15}
н2 -> н2 т2 • н4
+ н4 -> • н6
+ н4 -> • н4 т3 н6
+ н4 -> • н4 т4 н6
+ н6 -> • т7
+ н6 -> • т5 н1 т6
Следующие символы: т5{3}, т7{4}, н4{21}, н6{10}

Состояние {16}
н2 -> н2 т1 н4
н4 -> н4 • т3 н6
н4 -> н4 • т4 н6
Следующие символы: т3{17}, т4{18}

Состояние {17}
н4 -> н4 т3 • н6
+ н6 -> • т7
+ н6 -> • т5 н1 т6
Следующие символы: т5{3}, т7{4}, н6{19}

Состояние {18}
н4 -> н4 т4 • н6
+ н6 -> • т7
+ н6 -> • т5 н1 т6
Следующие символы: т5{3}, т7{4}, н6{20}

Состояние {19}
н4 -> н4 т3 н6

Состояние {20}
н4 -> н4 т4 н6

Состояние {21}
н2 -> н2 т2 н4
н4 -> н4 • т3 н6
н4 -> н4 • т4 н6
Следующие символы: т3{17}, т4{18}

Состояние {22}
н3 -> н3 т1 • н4
+ н4 -> • н6
+ н4 -> • н4 т3 н6
+ н4 -> • н4 т4 н6
+ н6 -> • т7
+ н6 -> • т5 н1 т6
Следующие символы: т5{3}, т7{4}, н4{24}, н6{10}

Состояние {23}
н3 -> н3 т2 • н4
+ н4 -> • н6
+ н4 -> • н4 т3 н6
+ н4 -> • н4 т4 н6
+ н6 -> • т7
+ н6 -> • т5 н1 т6
Следующие символы: т5{3}, т7{4}, н4{25}, н6{10}

Состояние {24}
н3 -> н3 т1 н4
н4 -> н4 • т3 н6
н4 -> н4 • т4 н6
Следующие символы: т3{17}, т4{18}

Состояние {25}
н3 -> н3 т2 н4
н4 -> н4 • т3 н6
н4 -> н4 • т4 н6
Следующие символы: т3{17}, т4{18}

Состояние {26}
н5 -> н5 т3 • н6
+ н6 -> • т7
+ н6 -> • т5 н1 т6
Следующие символы: т5{3}, т7{4}, н6{28}

Состояние {27}
н5 -> н5 т4 • н6
+ н6 -> • т7
+ н6 -> • т5 н1 т6
Следующие символы: т5{3}, т7{4}, н6{29}

Состояние {28}
н5 -> н5 т3 н6

Состояние {29}
н5 -> н5 т4 н6

Теперь можно составить пару таблиц (состояния x терминальные символы, состояния x нетерминалы)  и начать рубить код на КуМир'е

http://ict.edu.ru/ft/005128/ch7.pdf, страница 5

Управляющая программа выглядит следующим образом:
Установить ip на первый символ входной цепочки w$;
while (цепочка не закончилась)
{
    Пусть s – состояние на вершине магазина,  a – символ входной цепочки, на который указывает ip.
    if (action [s, a] == shift s’)
    {
        push (a);
        push (s’);
        ip++;
    }
    else if (action [s, a] == reduce A→β)
    {
        for (i=1; i<=|β|;  i++)
       {
          pop ();
          pop ();
       }
       Пусть s’ – состояние на вершине магазина;
       push (A);
       push (goto [s’, A]);
       Вывод правила (A→β);
    }
    else if (action [s, a] == accept)
    {
        return success;
    }
    else
    {
        error ();       
    }
}

Отредактировано Лис (2017-09-09 10:51:22)

0

11

По алгоритму со страницы - https://en.wikipedia.org/wiki/LR_parser … oto_tables

т1

т2

т3

т4

т5

т6

т7

$кон

н1

н2

н3

н4

н5

н6

{1}

-

2

-

-

3

-

4

-

5

6

7

8

9

10

{2}

-

-

-

-

3

-

4

-

-

-

-

-

-

11

{3}

-

2

-

-

3

-

4

-

12

6

7

8

9

10

{4}

п15

п15

п15

п15

п15

п15

п15

п15

-

-

-

-

-

-

{5}

-

-

-

-

-

-

-

вых

-

-

-

-

-

-

{6}

14

15

-

-

-

-

-

-

-

-

-

-

-

-

{7}

22

23

-

-

-

-

-

-

-

-

-

-

-

-

{8}

-

-

17

18

-

-

-

-

-

-

-

-

-

-

{9}

-

-

26

27

-

-

-

-

-

-

-

-

-

-

{10}

п9

п9

п9

п9

п9

п9

п9

п9

-

-

-

-

-

-

{11}

п12

п12

п12

п12

п12

п12

п12

п12

-

-

-

-

-

-

{12}

-

-

-

-

-

13

-

-

-

-

-

-

-

-

{13}

п16

п16

п16

п16

п16

п16

п16

п16

-

-

-

-

-

-

{14}

-

-

-

-

3

-

4

-

-

-

-

16

-

10

{15}

-

-

-

-

3

-

4

-

-

-

-

21

-

10

{16}

-

-

17

18

-

-

-

-

-

-

-

-

-

-

{17}

-

-

-

-

3

-

4

-

-

-

-

-

-

19

{18}

-

-

-

-

3

-

4

-

-

-

-

-

-

20

{19}

п10

п10

п10

п10

п10

п10

п10

п10

-

-

-

-

-

-

{20}

п11

п11

п11

п11

п11

п11

п11

п11

-

-

-

-

-

-

{21}

-

-

17

18

-

-

-

-

-

-

-

-

-

-

{22}

-

-

-

-

3

-

4

-

-

-

-

24

-

10

{23}

-

-

-

-

3

-

4

-

-

-

-

25

-

10

{24}

-

-

17

18

-

-

-

-

-

-

-

-

-

-

{25}

-

-

17

18

-

-

-

-

-

-

-

-

-

-

{26}

-

-

-

-

3

-

4

-

-

-

-

-

-

28

{27}

-

-

-

-

3

-

4

-

-

-

-

-

-

29

{28}

п13

п13

п13

п13

п13

п13

п13

п13

-

-

-

-

-

-

{29}

п14

п14

п14

п14

п14

п14

п14

п14

-

-

-

-

-

-

Отредактировано Лис (2017-09-07 18:29:45)

0

12

В этой таблице мне не ясно, когда происходит свёртка для бинарных плюсов и минусов.

Состояние {6}
н1 -> н2 •
н2 -> н2 • т1 н4
н2 -> н2 • т2 н4
Следующие символы: т1{14}, т2{15}

Глядя на это состояние можно было бы предположить, что тут то-ли свёртка, то-ли сдвиг.

https://en.wikipedia.org/wiki/Simple_LR_parser
"A grammar that has no shift/reduce or reduce/reduce conflicts when using follow sets is called an SLR grammar"
"If a grammar has table conflicts when using SLR follow sets, but is conflict-free when using LALR follow sets, it is called a LALR grammar."

раз конфликты есть, значит эта грамматика не SLR, переходим к следующему алгоритму.

https://en.wikipedia.org/wiki/LALR_parser
   описания смысла алгоритма на той странице нет, но есть ссылка - https://web.cs.dal.ca/~sjackson/lalr1.html
   для этой грамматики нужно построить множества (начал/концов) и другие таблицы

https://ru.wikipedia.org/wiki/LALR(1)
   На русской станице википедии есть удобочитаемое объяснение смысла алгоритма

Пусть есть грамматика, не разбираемая из-за конфликтов сдвиг-свертка или свертка-свертка по алгоритму SLR(1).

В этом случае грамматика преобразуется следующим образом:

- ищется нетерминал, на котором возникла вызвавшая конфликт свертка. Обозначим его A.
- вводятся новые нетерминалы A1, A2, …, An, по одному на каждое появление A в правых частях правил.
- везде в правых частях правил A заменяется на соответствующее Ak.
- набор правил с A в левой части повторяется n раз по разу для каждого Ak.
- правила с A в левой части удаляются, тем самым полностью удаляя A из грамматики.

Для преобразованной грамматики (она изоморфна исходной) повторяется попытка построения SLR(1) таблицы разбора.

Действие основано на том, что Follow(A) есть объединение всех Follow(Ak). В каждом конкретном состоянии новая грамматика имеет уже не A, а одно из Ak, то есть множество Follow для данного состояния имеет меньше элементов, чем для A в исходной грамматике.

Это приводит к тому, что для LALR(1) совершается меньше попыток поставить «приведение» в клеточку таблицы разбора, что уменьшает риск возникновения конфликтов с приведениями, иногда вовсе избавляет от них и делает грамматику, не разбираемую по SLR(1), разбираемой после преобразования.

К гадалке не ходить - в нашем случае это списки. Поэтому можно попробовать переделать второй вариант грамматики в третий.
Но применение в лоб русского описания алгоритма не даёт годного результата,
т.к. хотя конфликты сдвиг/свёртка пропадают, зато появляются конфликты свёртка/свёртка.

Происходит это так:
Преобразуемая грамматика-пример.
н1 -> н2
н2 -> н2 т1 т7
н2 -> т7

После преобразования:
н1 -> н2a
н2a -> н2b т1 т7
н2a -> т7
н2b -> н2b т1 т7
н2b -> т7

и всё бы хорошо, только
н2a -> т7
н2b -> т7
дают конфликт свёртка-свёртка...

Вывод: прийдётся всё-таки разбираться в оригинальной работе...

Отредактировано Лис (2017-09-08 09:20:49)

0

13

Пробуем сделать новую таблицу состояний, как предлагают в описании алгоритма LALR - https://web.cs.dal.ca/~sjackson/lalr1.html

Будем теперь обозначать номера наборов - верхними индексами, чтобы индексы не путались.

п1: н1 -> н2
п2: н2 -> н2 т1 т2
п3: н2 -> т2

Наборы:

набор {1}
$accept -> • н1 $кон
+ н1 -> • н2
+ н2 -> • н2 т1 т2
+ н2 -> • т2
Следующие символы: 1т22, 1н13, 1н24

набор {2}
н2 -> т2

набор {3}
$accept -> н1 • $кон

набор {4}
н1 -> н2
н2 -> н2 • т1 т2
Следующие символы: 4т15

набор {5}
н2 -> н2 т1 • т2
Следующие символы: 5т26

набор {6}
н2 -> н2 т1 т2

таблица переходов LR(0) выглядит так:

т1

т2

$кон

н1

н2

{1}

-

2

-

3

4

{2}

-

-

-

-

-

{3}

-

-

вых

-

-

{4}

5

-

-

-

-

{5}

-

6

-

-

-

{6}

-

-

-

-

-

построим расширенную грамматику
1н14 -> 1н24
1н26 -> 1н24 4т15 5т26
1н22 -> 1т22

Из полученного можно констатировать - перевести/понять раздел "Syntax Analysis Goal: Extended Grammars" с этой страницы мне не удалось (а там в начале инструкция - если не поняли, не двигайтесь дальше, сидите и медитируйте).

https://habrahabr.ru/post/140339/

Решение очевидно — детерминирование пунктов, порождающих свертку, по ожидаемому символу. То есть {C = B ·} трансформируется условно в {C = B · [expect EOF]} или для краткости {C = B ·, EOF}. Затрагиваются всего 2 момента — генерация пунктов (необходимо создавать пункты нового формата) и генерация ячеек со сверткой.

чувствую себя неочевиднящим

Рассмотрим вывод бизона (3-го):

Grammar

    0 $accept: input $end

    1 input: rule

    2 rule: rule '+' '1'
    3     | '1'

Terminals, with rules where they appear

$end (0) 0
'+' (43) 2
'1' (49) 2 3
error (256)

Nonterminals, with rules where they appear

$accept (5)
    on left: 0
input (6)
    on left: 1, on right: 0
rule (7)
    on left: 2 3, on right: 1 2

State 0

    0 $accept: . input $end

    '1'  shift, and go to state 1

    input  go to state 2
    rule   go to state 3

State 1

    3 rule: '1' .

    $default  reduce using rule 3 (rule)

State 2

    0 $accept: input . $end

    $end  shift, and go to state 4

State 3

    1 input: rule .  [$end]
    2 rule: rule . '+' '1'

    '+'  shift, and go to state 5

    $default  reduce using rule 1 (input)

State 4

    0 $accept: input $end .

    $default  accept

State 5

    2 rule: rule '+' . '1'

    '1'  shift, and go to state 6

State 6

    2 rule: rule '+' '1' .

    $default  reduce using rule 2 (rule)

У него есть совершенно чудесный пункт

Код:
State 3

    1 input: rule .  [$end]
    2 rule: rule . '+' '1'

    '+'  shift, and go to state 5

    $default  reduce using rule 1 (input)

https://www.gnu.org/software/bison/manu … nding.html
"some items are eligible only with some set of possible lookahead tokens. When run with --report=lookahead, Bison specifies these lookahead tokens"

но как он получен - непонятно

он выведен из правой части таблицы про переходы с нетерминалов.
http://3e8.org/pub/scheme/doc/parsing/Efficient Computation of LALR(1) Look-Ahead Sets.pdf
we focus attention on nonterminal transitions and define "follow sets" for them.
и там 35 страниц объяснений, как это правильно сделать.

Поэтому, прогоним грамматику через бизон, полученную таблицу используем (без понимания того, как она получена).
Но так - не спортивно, весь интерес пропадает.

Отредактировано Лис (2017-09-08 15:35:02)

0

14

http://www.larc.usp.br/~pbarreto/LR.pdf

most popular is undoubtedly DeRemer and Pennello’s
algorithm by Park, Choe and Chang (henceforth called simply PCC) is arguably more efficient,
and another by Ives is claimed to be even more so.
Recent research into the subject includes the method of Anzai.

2003, Paulo S. L. M. Barreto, "An Efficient LALR(1) and LR(1) Lookahead Set Algorithm," technical report.
1991, H. Anzai. Almost boolean algebraic computation of LALR(1) look-ahead set. Journal of Information Processing, 14(1):1–15.
  (текст не нашел)
1986, Ives.  Unifying  view  of  recent LALR (1)  lookahead  set  algorithms. SIGPLAN  Notices,  21(7):131–135
  (если бы у нас была подписка на ACM, то текст можно было бы прочитать там, в открытом интернете я его не нашел)
1985, Park, Choe, Chang, A New Analysis of LALR Formalisms
1982, DeRemer,  Pennello.  Efficient  computation  of LALR(1)  look-ahead  sets. ACM  Transactions  on Programming Languages and Systems, 4(4):615–649,

учитаться можно...

Вот тут вроде понятно расписано, как вычисляется LOOKAHEAD для каждого правила вывода. Надо будет как-нибудь при случае попробовать...

Отредактировано Лис (2017-09-08 22:59:57)

0

15

Калькулятор нужен какой-нибудь особенный. Назовём его "предельно простой целочисленный (ППЦ)".
Число будем использовать одно - "палочка", и операцию одну.
Поскольку операция одна, (например операция склейки/конкатенации.
Для стрелок Пирса/штрихов Шиффера нужны скобки, а лень)
то мы никак не будем её обозначать на письме.

На входе калькулятор будет получать палочки логически разделённые подразумеваемым символом склейки,
а на выходе будет выдавать результат склейки
(визуально выход не будет отличаться от входа, но нам важно не это).

грамматика
    : выражение
    ;

выражение
    : выражение палочка
    | палочка
    ;

палочка
    : '1'
    ;

Для краткости сократим названия нетерминалов до н1 и н2,
а терминала до т1

н1 -> н2
н2 -> н2 т1
н2 -> т1

Составим для автомата ситуации, но не как в прошлый раз для LR(0) а теперь для LR(1)

набор 1
н1 -> • н2, {$end}
  здесь, наверное, должна быть сгенерирована "свёртка" п1, она же (у нас) финальная
н2 -> • н2 т1, {т1}
н2 -> • т1, {т1}

набор 2
н2 -> н2 • т1, {т1}
н2 -> • т1, {т1}

набор 3
н2 -> т1 • , {т1, $end}
  здесь, наверное, и будет проверена правильность реализации алгоритма вычисления follow sets
  здесь, наверное, должна быть сгенерирована "свёртка" п3

набор 4
н2 -> н2 т1 •, {$end}
  здесь, наверное, должна быть сгенерирована "свёртка" п2

Конфликта теперь вроде бы нет. Надо попробовать на грамматике по-крупнее...

Отредактировано Лис (2017-09-09 13:41:31)

0

16

С Яром все в порядке. У него много работы и оффлайновых дел.

0


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » планирование » Яр молчит уже 53-ий день, я волнуюсь.