2016-10-26 2 views
0

Я пытаюсь написать грамматику пропозициональной логики с целью создания парсера LL (лексический анализ).Правильность грамматики для логики высказываний

Я попробовал следующую грамматику:

F = F and F 
F = F or F 
F = F => F 
F = F <=> F 
F = not F 
F = (F) 
D = a 

, но я обнаружил, что она неоднозначна. Я попробовал следующее, чтобы устранить эту двусмысленность:

F = F and A 
F = A 
A = F or B 
A = B 
B = F => C 
B = C 
C = F <=> C 
C=D 
D = not F 
D = (F) 
D = a 

Правильно ли эта грамматика? Удалось ли мне устранить двусмысленность?

+0

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

+0

токенизация? nooooooooo –

+0

Возможно, я ошибаюсь в этот момент, поскольку я сказал, что прошло некоторое время с тех пор, как я изучил этот материал. – EJoshuaS

ответ

0

Грамматика по-прежнему неоднозначна. Вот два деривации для не и:

Вывод 1:

F 
F and A 
A and A 
B and B 
C and C 
not F and a 
not A and a 
not B and a 
not C and a 
not D and a 
not a and a 

Вывод 2:

F  
A 
B 
C 
D 
not F 
not F and A 
not A and A 
not B and B 
not C and C 
not D and D 
not a and a 

Вы должны поставить скобки вокруг выводов, например F = (F и A)

Другая возможность, если вы не хотите использовать круглые скобки, заключается в использовании prefix notation.

Смежные вопросы