Я изучаю свои компьютерные языки, и есть одна идея: у меня проблемы с обволакиванием головы.Regular vs Context Free Grammars
Я понял, что обычные грамматики проще и не могут содержать двусмысленности, но не могут выполнять множество задач, необходимых для языков программирования. Я также понял, что контекстно-свободные грамматики допускают двусмысленность, но позволяют некоторые вещи, необходимые для языков программирования (например, палиндромы).
Что у меня возникают проблемы с является понимание того, как я могу получить все вышеперечисленное, зная, что регулярные грамматики нетерминалы можно сопоставить с терминалом или нетерминал с последующим терминалом или что контекстно-свободной нетерминальными карты в любая комбинация терминалов и нетерминалов.
Может кто-нибудь помочь мне собрать все это вместе?
Во-первых: регулярные грамматики могут быть неоднозначными (пример от Kai Kuchenbecker: S -> aA | aB, B -> a, A -> a). Единственное, что можно найти только узлы в синтаксическом дереве (например, неоднозначность ассоциативности не существует, когда используется регулярная грамматика). Второе: может быть более одной правой стороны к нетерминальному (A -> a, A -> aA, а википедия даже включает epsilon в качестве третьей альтернативы: http://en.wikipedia.org/wiki/ Regular_grammar) – user764754
неопределенность приходит, когда предложение может быть получено из вашей грамматики более чем в одном пути деривации.просто имея более одного правила производства для нетерминала, не делает грамматику неоднозначной. – Sujoy
Этот пример на самом деле ошибочен. Если мы представляем, что полные правила должны быть «A-> a | c' и 'B-> b', то эта грамматика допускает непалиндромы. Например, я мог бы создать: 'S-> ABA-> aBA-> abA-> abc'. Проблема заключается в том, что мы не хотим создавать две переменные в первом правиле, а не в двух терминалах. Возможность грамматики, которая позволяет палиндромы: 'S -> aSa | bSb | a | b' – gdiazc