Syntaxe (programovací jazyk)
V informatice je syntaxe programovacího jazyka soubor pravidel, která definují kombinaci symbolů, které jsou považovány za správně strukturovaný dokument nebo fragment v tomto jazyce. To platí jak pro programovací jazyky, kde dokument představuje zdrojový kód, tak pro značkovací jazyky, kde dokument představuje data. Syntaxe jazyka definuje jeho povrchovou formu. Textové programovací jazyky jsou založeny na posloupnosti znaků, zatímco vizuální programovací jazyky jsou založeny na prostorovém uspořádání a spojení mezi symboly (které mohou být textové nebo grafické). Dokumenty, které jsou syntakticky neplatné, obsahují syntaktickou chybu.
Syntaxe – forma – je protikladem k sémantice – významu. Při zpracování programovacích jazyků, sémantické zpracování obvykle přichází po syntaktického zpracování, ale v některých případech je sémantické zpracování nezbytné pro dokončení syntaktické analýzy, a ty jsou prováděny společně nebo současně. V překladači, front-end (přední část) provádí syntaktickou analýzu, zatímco sémantickou analýzu provádí back-end (zadní část; a middle-end, pokud je tato fáze rozlišována).
Úrovně syntaxe
editovatSyntaxe programovacího jazyka je obvykle rozdělena do tří úrovní.
- Slova – lexikální úroveň, určuje jak znaky utváří tokeny
- Fráze – gramatická úroveň, stručně řečeno, určuje, jak tokeny utváří fráze
- Kontext – určuje na které objekty nebo proměnné názvy odkazují, jestli jsou typy validní, atd.
Rozdělení tímto způsobem přináší modularitu umožňující každé úrovni být popsána a zpracována samostatně a často nezávisle. Nejprve lexer převede lineární posloupnost znaků na lineární posloupnost tokenů, což je známo jako „lexikální analýza“ nebo „lexing“. Poté parser převede lineární posloupnost tokenů na hierarchický syntaktický strom, což je známo jako „syntaktická analýza“. Nakonec kontextová analýza překládá názvy a provádí typovou kontrolu.
Příklady chyb
editovatJako příklad, (add 1 1)
je syntakticky validní zápis Lisp programu (za předpokladu, že funkce 'add' existuje), který sečte 1 a 1. Nicméně, následující zápisy jsou nevalidní:
(_ 1 1) ; lexikální chyba: '_' není validní
(add 1 1 ; chyba parseru: chybějící závorka ')'
(add 1 x) ; chyba jména: 'x' neexistuje
Všimněte si, že lexer není schopen rozpoznat první chybu – ví pouze to, že po vytvoření tokenu LEFT_PAREN
'(
' je zbytek programu neplatný, protože žádné lexikální pravidlo nezačíná '_
'. Druhá chyba je zjištěna ve fázi parsování: parser identifikoval produkční pravidlo "seznam" kvůli tokenu '(
' (jako jediná shoda), a proto může vydat chybové hlášení.
Typové chyby a chyby nedeklarovaných proměnných jsou někdy považovány za syntaktické chyby, pokud jsou zjištěny v době kompilace (což je obvykle případ kompilace silně typovaných jazyků), ačkoli je běžné klasifikovat tyto druhy chyb spíše jako sémantické chyby.
Například následující Python kód
'a' + 1
obsahuje typovou chybu – součet řetězce a čísla. To může být objeveno na úrovni parsingu (fáze analýzy), jestliže máme oddělená pravidla pro „řetězec + řetězec“ a „číslo + číslo“, ale obvykle to bude místo toho analyzováno obecným pravidlem jako „LiteralNeboIdentifikator + LiteralNeboIdentifikator“ a pak budou chyby odhaleny ve fázi kontextové analýzy, kde dochází k typové kontrole. V některých případech nemůže být toto ověření provedeno a tyto syntaktické chyby jsou detekovány až za běhu.
V dynamicky typovaném jazyce, kde typ je určován až za běhu, mohou být typové chyby často detekovány až za běhu. Následující Python kód
a + b
je nejednoznačný, a protože je syntakticky správně na úrovni fráze, může být validita ověřena až za běhu, protože proměnné v Pythonu nemají typ, ten mají pouze hodnoty.
Definice syntaxe
editovatSyntaxe textových programovacích jazyků je obvykle definována využitím kombinace regulárních výrazů (pro lexikální strukturu) a Backusovy-Naurovy formy (pro gramatickou strukturu) k indukčnímu stanovení syntaktických kategorií (neterminály) a terminálních symbolů.
Odkazy
editovatReference
editovatV tomto článku byl použit překlad textu z článku Syntax (programming languages) na anglické Wikipedii.