Ez a ennek folytatása. a> kérdés, amit korábban feltettem egy BNFC-grammatikáról a propozíciós logikához. A definíció szerint zárójelekkel dolgoztam, de most szeretném kiterjeszteni a nyelvtant zárójel nélkülire, de egy fogással: felesleges külső zárójelek nem megengedettek.
Például a a
atommondatot engedélyezni kell, de a (a)
-t nem szabad felismerni. A (a => b) & c
mondatot is engedélyezni kell, de a ((a => b) & c)
nem, és így tovább. Az utolsó példa rávilágít a zárójelek szükségességére. Az elsőbbségi szintek a következők
- egyenértékűség
<=>
és implikáció=>
, - konjunkció
&
és diszjunkció|
- tagadás
-
és - atomok.
Minél magasabb a szint, annál korábban kerül elemzésre.
A nyelvtant a szükségtelen zárójelekkel dolgoztam fel úgy, hogy rekurzióval prioritási szinteket állítottam be a különböző operátorokhoz:
IFF . L ::= L "<=>" L1 ;
IF . L ::= L "=>" L1 ;
AND . L1 ::= L1 "&" L2 ;
OR . L1 ::= L1 "|" L2 ;
NOT . L2 ::= "-" L3 ;
NOT2 . L2 ::= "-" L2 ;
P . L3 ::= Ident ;
_ . L ::= L1 ;
_ . L1 ::= L2 ;
_ . L2 ::= L3 ;
_ . L3 ::= "(" L ")" ;
Most az a kérdés, hogyan nem engedhetem be a külső zárójeleket, aminek a megengedését az utolsó L3 ::= "(" L ")";
szabály okozza? Feltétlenül szükséges a zárójelek egy kifejezésen belüli engedélyezéséhez, de az éleken is engedélyezi. Azt hiszem, szükségem van valami extra szabályra a kétértelműség megszüntetésére, de milyen lehet az?
Ez a nyelvtan körülbelül 6 redukciós/kicsinyítési konfliktust is eredményez, de ezek nem elkerülhetetlenek a rekurzív definíciókban?
r
utótagokat számokká kell alakítani, és a|
szimbólumot nem ismeri fel a rendszer, mint a BNF sok más változatában. Az utolsó szabályoknak a saját sorukban kell lenniük. 15.04.2020|
használatát. Feltételezve, hogy ez az a BNFC, amelyről beszél, nem látok semmit, ami problémássá tenné aL1r
használatát. 15.04.2020bnfc
panaszkodott ezekről a konkrét szabályokról. A probléma az, hogy látszólag a kényszerített szabályoknak ugyanazzal az alapazonosítóval kell rendelkezniük (betűkből álló előtag), és a különböző kényszerítési szinteket postfix számok választják el. Ennek magyarázata itt. 15.04.2020(
karakterrel kezdődik. Egyébként szerintem aS
kezdőszimbólumhoz is kell egy címke, példáulStart . S ::= L;
. Úgy tűnik, a BNFC is panaszkodik, ha nincs legalább egy szabály, amelynek végén nincs számjegy, ez aL
típusú produkciók úgynevezett alapesete. 15.04.2020(
-el, mert aL1
ésL2
változókat az ezeket használó produkciók végére helyezted. 15.04.2020