Context Free Grammar is formal grammar, the syntax or structure of a formal language can be described using context-free grammar (CFG), a type of formal grammar. The grammar has four tuples: (V,T,P,S).
V - It is the collection of variables or non-terminal symbols.
T - It is a set of terminals.
P - It is the production rules that consist of both terminals and non-terminals.
S - It is the starting symbol.
A grammar is said to be the Context-free grammar if every production is in the form of :
G -> (V∪T)*, where G ∊ V
The above equation states that every production which contains any combination of the ‘V’ variable or ‘T’ terminal is said to be a context-free grammar.
For example, the grammar A = < S, a, b >having productions:
S-> aS
S-> bSa
a->bSa, or
a->ba is not a CFG as on the left-hand side there is a variable which does not follow the CFGs rule.
Lets consider the string “ aba” and and try to derive the given grammar from the productions given. we start with symbol S, apply production rule S->bSa and then S->aS (S->a) to get the string “aba”.
Parse tree of string “aba”
In the computer science field, context-free grammars are frequently used, especially in the areas of formal language theory, compiler development, and natural language processing. It is also used for explaining the syntax of programming languages and other formal languages.
Apart from all the uses and importance of Context-Free Grammar in the Compiler design and the Computer science field, there are some limitations that are addressed, that is CFGs are less expressive, and neither English nor programming language can be expressed using Context-Free Grammar. Context-Free Grammar can be ambiguous means we can generate multiple parse trees of the same input. For some grammar, Context-Free Grammar can be less efficient because of the exponential time complexity. And the less precise error reporting as CFGs error reporting system is not that precise that can give more detailed error messages and information.
With all it’s limitations in expressiveness, ambiguity, efficiency, and error reporting CFG still remains as important fundamental concept that should be learnt for understanding complier design and constructing syntax of a formal language.
A deterministic context-free grammar can be parsed using deterministic pushdown automata (DPDA) and each step in it is determined uniquely. Whereas Non-deterministic context-free grammar requires Non-deterministic pushdown automata (NPDA) and each step in it has many options.
A grammar is said to be ambiguous if there exists at least one string that can be generated in many ways, that gives multiple different parse trees for the same string. The ambiguity in a grammar can be eliminated by rewriting the grammar to remove the multiple parse trees, though it is not always possible for all grammars.
A parse tree , also known as a syntax tree, is a tree-like representation of a string’s semantics according to a grammar. The root is the start symbol and the leaves are terminals. It is used to validate nested data structure in JSON format, and used verify the syntax of the source code.