EBNF is a notation for formally describing syntax: how to write the linguistic We will use EBNF to This book uses Extended Backus–Naur Form (EBNF) to. Nonterminals written as-is. – Special symbols (partial list). Note: this is only one variation of EBNF syntax, there are other variations as well. Symbol. Meaning.. How did BNF come about? • John Backus presented a new notation containing most of the elements of BNF at a UNESCO conference. • His presentation was.
|Published (Last):||14 April 2018|
|PDF File Size:||2.32 Mb|
|ePub File Size:||2.88 Mb|
|Price:||Free* [*Free Regsitration Required]|
Do you need to strengthen the security of the mobile apps you build?
EBNF is a way to specify a formal language grammar. While there are two possible usages for a grammar, we are typically interested only in the first one: Okay, but what does EBNF stand for? ABNF’s main purpose is to describe bidirectional communications protocols. EBNF is the most used one. In the rest of the article, we will add more comments when looking at specific parts of EBNF. Later, we could refer to them while explaining the rules.
Note also that for each language, you could have different equivalent grammars. So for the same language, you could find grammars which are not exactly the same, and yet they are correct anyway. TinyC is a simplified version of C. We picked it because a grammar for a common programming language would be way too complex to serve as an example.
We would typically look at grammars longer than 1, lines. We define a grammar by specifying how to combine single elements in significant structures. As a first approximation, we can consider single words to be elements. The structures correspond to sentences, periods, paragraphs, chapters, and entire documents.
A grammar tells us what are the correct ways to put together single words to obtain sentences, and how we can progress by combining sentences into periods, periods into paragraphs, and so on until we get the entire document.
Terminals are sometimes also called tokens.
They are the ebbnf block we consider in our EBNF grammars. Finally, we could group terminal definitions somewhere and then use their names to refer to them. Using definitions have the advantage of permitting to reuse them multiple times. Whitespaces and comments are typically ignored in EBNF grammars.
This is because usually they could be used everywhere in the language, so they should be reported all over the grammar. Some tools have specific options to mark some terminals as terminals to ignore. Terminals are defined using string constants or regular expressions.
Non-terminals are obtained by grouping terminals and other non-terminals tutlrial a hierarchy. Our tree will ttuorial a root: The root will contain other non-terminals that will contain other non-terminals and so on. The picture below shows how we can go from a stream of tokens or terminals to an AST, which groups terminals into a hierarchy of non-terminals.
We have ebnc that non-terminals represent structures at different levels. Examples of non-terminals are:. An EBNF grammar is substantially a list of production rules.
Each production rule tells us how a non-terminal can be composed. We are now going to see the different elements that we can use in such rules. We have seen that a terminal can be defined in-line, specifying a string or a regular expression, or can be defined elsewhere and simply referred to in a rule. The latter method is not technically part of EBNF, but it is commonly used. Similarly to references to terminals we can also refer to non-terminals. However, this can lead to left-recursive rules that are typically forbidden.
For more details see the paragraph on recursion in grammars. It is also called concatenation, and in the standard EBNF commas are used between tutorisl, while typically you just use spaces to separate the elements of the sequence.
There are some constructs, or portions of constructs, that can be defined in different ways. To represent ebfn case we use alternatives. In the standard EBNF, tutroial elements are represented inside square brackets. However, it is more common to find them represented by a question mark following the optional element.
In the standard EBNF, optional elements are represented inside curly brackets. However, it is more common to find them represented by an asterisk following the element to repeat. We can group multiple elements together by using round parenthesis. This is typically used because a modifier optional, zero-or-more, one-or-more must be applied to a set of elements.
It can also be used to control the precedence of operators. We have seen what constructs we can use to define production rules. EBNF lets us define recurring grammars. Recurring grammars are grammars that tutorjal recurring production rules, i.
The fact is that many tools that process EBNF grammars cannot deal with that because they risk entering infinite loops. There are ways to refactor left recurring rules, however, they lead to less clear grammars. So, if you can, just use modern tooling that deals with left and right recurring grammars. Precedence could refer to two things: In this case, tutorlal all know that the multiplication has precedence on the addition. In the languages, tuorial are going to define we can have many different rules and we need to define a specific order to consider them.
The traditional way to manage precedence is to define a list of different rules that refers to each other.
BNF and EBNF: What are they and how do they work?
The typical example is shown in TinyC:. The grammar as it is defined makes first parse single terms id, integer, or expressions between parenthesis. Later this can be possibly combined using the plus or the minus sign. Then the less than the operator can be used and this can be part of an expression, the top level rule considered.
This is a relatively simple example but in richer languages we could have intermediate rules like test and sum, to represent different groups of operators with the same precedence.
The thing about the multiplication, division, power, comparison operators, logical operators, array access, etc. There are many possible ways to build expressions and you need to define an order of precedence.
Now, some modern tools use just the order in which alternatives are defined to derive the precedence rules. We could have lists that must have at least one element and lists which can have zero elements.
We can imagine a language where all these examples are syntactically correct, i. However, they are all semantically incorrect, because they do not respect additional constraints on how the language should be used. These semantics constraints are used in addition to the grammar after the structures of the language have been recognized. By combining syntactic and semantic rules we can express what is valid in our language.
How do you define semantic rules? By writing code that works on the AST. You cannot do that in the EBNF grammar.
Grammar: The language of languages (BNF, EBNF, ABNF and more)
An EBNF grammar tuorial useful to support discussion and to communicate with other langue designers. Typically you may want to do more with it: You could be interested in learning more about parsing.
We have prepared different articles explaining how to proceed depending on the language you prefer to work with:. In this article we aimed to be practical: We have discussed the differences between typical usages and the standard and tried to give a complete and correct picture. There are things we did not discuss: We have not discussed what a context-free grammar is.
The language of languages
The theory tells us that EBNF cannot be used to describe all possible forms of grammars. However, it is powerful enough to describe all formal languages you should be interested in writing. See the original article here. Over a million developers have joined DZone. How to Describe the Grammar of a Language. Learn the basics of EBNF, the most commonly used formalism to describe the structure of programming languages, and how to use it in practice.
Join the DZone community and get the full member experience. EBNF is the most commonly used formalism to describe the structure of languages. In this article, we are going to see: How we can define a grammar using EBNF.
A few things to consider when using EBNF. How to use EBNF in practice today. A summary with some final thoughts. Does it sound like a plan? The possible ways to build a valid piece of code in the formal language. Based on this, we could: