Az informatikában a kétértelmű nyelvtan olyan formális nyelvtan , amely egy adott karakterláncot többféleképpen is generálhat (vagyis egy karakterlánchoz egynél több elemzőfa tartozik ) . Egy nyelvről azt mondjuk , hogy alapvetően kétértelmű , ha csak kétértelmű nyelvtanok generálhatják.
Egyes programozási nyelvek nyelvtana nem egyértelmű. Az ilyen nyelvek elemzésekor szemantikai információkat kell figyelembe venni a megfelelő változat kiválasztásához. Például C nyelvben a következő bejegyzés:
x*y;a következőképpen értelmezhető :
Az értelmezések közötti választáshoz a fordítónak meg kell néznie a szimbólumtáblázatát, hogy megtudja, a deklaráció xtypedef név volt-e egy adott hatókörben.
Kontextus mentes nyelvtan
A → A + A | A − A | akétértelmű, mivel az a + a + a karakterláncnak két bal oldali kimenete van:
A | →A+A | A | →A+A | ||
→ a+A | →A+A+A | ||||
→ a+A+A | → a+A+A | ||||
→ a+a+A | → a+a+A | ||||
→ a + a + a | → a + a + a |
Ezenkívül a nyelvtan kétértelmű, mert az a + a − a karakterlánchoz két elemzőfa tartozik:
Az általa generált nyelv azonban alapvetően nem kétértelmű, mivel a következő egyértelmű nyelvtan ugyanazt a nyelvet generálja:
A → A + a | A − a | aAz általános probléma annak meghatározására, hogy egy nyelvtan kétértelmű-e, algoritmikusan eldönthetetlen . Nem létezik olyan algoritmus, amely meghatározza egy nyelvtan kétértelműségét, mivel Post megoldhatatlan megfelelési problémája kétértelműségi problémává redukálódik.
Nyilvánvaló nehézséget okoz egy kétértelmű nyelvtan determinisztikus értelmezővel történő elemzése, de a nem determinisztikus elemzés jelentős hatékonyságcsökkenést eredményez. A legtöbb elemzést igénylő konstrukció egyértelműen felismerhető a nyelvtanokkal. Egyes kétértelmű nyelvtanokat át lehet alakítani egyértelmű nyelvtanokká, de erre az átalakításra nincs általános eljárás, mint ahogy a nyelvtan kétértelműségének meghatározására sem létezik algoritmus. A fordítógenerátorok , mint például a YACC , képesek bizonyos típusok egyértelművé tételére, például elsőbbségi és asszociativitási megszorítások használatával .
Míg egyes nyelvek (egy nyelvtan által generált karakterlánc-készletek) egyértelmű és kétértelmű nyelvtanokkal is rendelkeznek, vannak nyelvek, amelyekre nincs egyértelmű nyelvtan. A lényegében kétértelmű nyelvre példa a és unió . Ez egy kontextusmentes nyelv, mint a kontextusmentes nyelvek ötvözete, de a Bevezetés az automataelméletbe… bizonyítékot tartalmaz arra , hogy nem lehetséges a karakterláncok egyedi elemzése abban a (nem kontextusmentes) részhalmazban , amely a kettő metszéspontja. nyelvek.
Formális nyelvek és formális nyelvtanok | |
---|---|
Általános fogalmak | |
Típus 0 | |
1. típus |
|
2. típus | |
3. típus |
|
elemzése |