Рассмотрим язык (Σ,R,S), определенный

Σ = { ′(′, ′)′ }  
R = {S → SS, S → (S), S → ϵ }

1. Какая грамматика у этого языка? Разве это не просто список производственных правил, следовательно, R? Если нет, что отличает грамматику от списка производственных правил?

2. Как мне тогда приступить к созданию синтаксического анализатора сверху вниз на основе этой грамматики? Я видел, как упоминалось, что задействован стек.

У меня уже есть токенизатор, предоставленный моим профессором, но я, честно говоря, понятия не имею, как реализовать его в коде (C++).

Изменить: содержал ссылки на DFA, которые теперь кажутся не связанными, поэтому, возможно, это было неправильное понимание описания проекта.

1
Tyler Klement 8 Фев 2014 в 23:07
По поводу №1: IIUC, вы не можете, ни один конечный автомат не может распознать язык сбалансированных круглых скобок.
 – 
user395760
8 Фев 2014 в 23:22
Если вас попросят написать DFA для этого языка, вас, вероятно, попросят на самом деле опровергнуть его принадлежность к набору DFA-эквивалентных регулярных языков, используя лемму о перекачке. Если вы случайно упомянули DFA, изучите рекурсию (вы также можете изменить вопрос).
 – 
digenishjkl
9 Фев 2014 в 00:08

1 ответ

Лучший ответ

Грамматику можно записать как:

S  = 
   | '(', S, ')', S
   ;

Добавляю для парсера псевдокод. Сначала функции для доступа и управления потоком токенов.

IsEof: Bool // checks for end of token stream
Get: Token   // gets next token
Peek: Token // peeks next token without removing it

Потом парсер. S распознается как пустой поток токенов или набор парен, за которым следует другой S.

Parse_S
  // If no tokens left, there is a match.
  if (IsEof) return True // OK
  // Expect at least one paren set, but possibly more
  else return (Peek == '(') && (Parse_ParenSet) && (Parse_S)

Набор скобок - это буква S, заключенная в круглые скобки.

Parse_ParenSet
  // Expect a paren set.
  if (IsEof) return False // Error
  // Expect an S enclosed in Parenthesis.
  else return (Get == '(') && (Parse_S) && (Get == ')')

Теперь вы сможете продолжить задание.

2
Toon Krijthe 10 Мар 2014 в 15:12