An attribute grammar is a formal way to supplement a
formal grammar
A formal grammar is a set of Terminal and nonterminal symbols, symbols and the Production (computer science), production rules for rewriting some of them into every possible string of a formal language over an Alphabet (formal languages), alphabe ...
with semantic information processing. Semantic information is stored in
attributes associated with
terminal and nonterminal symbols of the grammar. The values of attributes are the result of attribute evaluation rules associated with productions of the grammar. Attributes allow the transfer of information from anywhere in the
abstract syntax tree to anywhere else, in a controlled and formal way.
Each semantic function deals with attributes of symbols occurring only in one production rule: both semantic function parameters and its result are attributes of symbols from one particular rule. When a semantic function defines the value of an attribute of the symbol on the left hand side of the rule, the attribute is called ''synthesized''; otherwise it is called ''inherited''. Thus, synthesized attributes serve to pass semantic information up the parse tree, while inherited attributes allow values to be passed from the parent nodes down and across the syntax tree.
In simple applications, such as evaluation of arithmetic expressions, attribute grammar may be used to describe the entire task to be performed besides parsing in straightforward way; in complicated systems, for instance, when constructing a language translation tool, such as a compiler, it may be used to validate semantic checks associated with a grammar, representing the rules of a language not explicitly imparted by the syntax definition. It may be also used by
parser
Parsing, syntax analysis, or syntactic analysis is a process of analyzing a string of symbols, either in natural language, computer languages or data structures, conforming to the rules of a formal grammar by breaking it into parts. The term '' ...
s or
compiler
In computing, a compiler is a computer program that Translator (computing), translates computer code written in one programming language (the ''source'' language) into another language (the ''target'' language). The name "compiler" is primaril ...
s to translate the syntax tree directly into code for some specific machine, or into some
intermediate language
An intermediate representation (IR) is the data structure or code used internally by a compiler or virtual machine to represent source code. An IR is designed to be conducive to further processing, such as optimization and translation. A "good" ...
.
History
Attribute grammars were invented by
Donald Knuth
Donald Ervin Knuth ( ; born January 10, 1938) is an American computer scientist and mathematician. He is a professor emeritus at Stanford University. He is the 1974 recipient of the ACM Turing Award, informally considered the Nobel Prize of comp ...
and
Peter Wegner Peter Wegner may refer to:
* Peter Wegner (computer scientist) (1932–2017), professor of computer science at Brown University, Rhode Island, United States
* Peter Wegner (American artist) (born 1963)
* Peter Wegner (Australian artist)
See also .
[D. E. Knuth]
The genesis of attribute grammars
''Proceedings of the international conference on Attribute grammars and their applications'' (1990), LNCS
vol. 461
1–12. While Donald Knuth is credited for the overall concept, Peter Wegner invented inherited attributes during a conversation with Knuth. Some embryonic ideas trace back
to the work of Edgar T. "Ned" Irons,
the author of
IMP.
Example
The following is a simple
context-free grammar
In formal language theory, a context-free grammar (CFG) is a formal grammar whose production rules
can be applied to a nonterminal symbol regardless of its context.
In particular, in a context-free grammar, each production rule is of the fo ...
which can describe a language made up of multiplication and addition of integers.
Expr → Expr + Term
Expr → Term
Term → Term * Factor
Term → Factor
Factor → "(" Expr ")"
Factor → ''integer''
The following attribute grammar can be used to calculate the result of an expression written in the grammar. Note that this grammar only uses synthesized values, and is therefore an
S-attributed grammar.
Expr
1 → Expr
2 + Term
1.value = Expr2.value + Term.value ">Expr1.value = Expr2.value + Term.value Expr → Term
Expr.value = Term.value Term
1 → Term
2 * Factor
1.value = Term2.value * Factor.value ">Term1.value = Term2.value * Factor.value Term → Factor
Term.value = Factor.value Factor → "(" Expr ")"
Factor.value = Expr.value Factor → ''integer''
Factor.value = strToInt(''integer''.str)
Synthesized attributes
A synthesized attribute is computed from the values of attributes of the children. Since the values of the children must be computed first, this is an example of bottom-up propagation. To formally define a synthesized attribute, let
be a formal grammar, where
*
is the set of non terminal symbols
*
is the set of terminal symbols
*
is the set of
productions
*
is the distinguished, or start, symbol
Then, given a string of nonterminal symbols
and an attribute name
,
is a synthesized attribute if all three of these conditions are met:
*
(i.e.
is one of the rules in the grammar)
*
(i.e. every symbol in the body of the rule is either nonterminal or terminal)
*
, where
(i.e. the value of the attribute is a function
applied to some values from the symbols in the body of the rule)
Inherited attributes
An ''inherited attribute'' at a node in parse tree is defined using the attribute values at the parent or siblings. Inherited attributes are convenient for expressing the dependence of a programming language construct on the context in which it appears. For example, we can use an inherited attribute to keep track of whether an identifier appears on the left or the right side of an assignment in order to decide whether the address or the value of the identifier is needed. In contrast to synthesized attributes, inherited attributes can take values from parent and/or siblings. As in the following production,
: S → ABC
where A can get values from S, B, and C. B can take values from S, A, and C. Likewise, C can take values from S, A, and B.
Special types of attribute grammars
*
L-attributed grammar: ''inherited attributes'' can be evaluated in one left-to-right traversal of the abstract syntax tree
*
LR-attributed grammar: an L-attributed grammar whose ''inherited attributes'' can also be evaluated in
bottom-up parsing In computer science, parsing reveals the grammatical structure of linear input text, as a first step in working out its meaning. Bottom-up parsing recognizes the text's lowest-level small details first, before its mid-level structures, and leaves t ...
.
*
ECLR-attributed grammar: a subset of LR-attributed grammars where equivalence classes can be used to optimize the evaluation of inherited attributes.
*
S-attributed grammar: a simple type of attribute grammar, using only ''synthesized attributes'', but no ''inherited attributes''
See also
*
Affix grammar
*
Van Wijngaarden grammar
*
Syntax-directed translation Syntax-directed translation refers to a method of compiler implementation where the source language translation is completely driven by the parser.
A common method of syntax-directed translation is translating a string into a sequence of actions by ...
References
* Original paper introducing attributed grammars: ,
External links
Why Attribute Grammars Matter The Monad Reader, Issue 4, July 5, 2005. (This article narrates on how the formalism of attribute grammars brings
aspect-oriented programming to
functional programming
In computer science, functional programming is a programming paradigm where programs are constructed by Function application, applying and Function composition (computer science), composing Function (computer science), functions. It is a declarat ...
by helping writing
catamorphisms
compositionally. It refers to th
Utrecht University Attribute Grammar system (see als
as the implementation used in the examples.)
Attribute grammarin relation to
Haskell
Haskell () is a general-purpose, statically typed, purely functional programming language with type inference and lazy evaluation. Designed for teaching, research, and industrial applications, Haskell pioneered several programming language ...
and
functional programming
In computer science, functional programming is a programming paradigm where programs are constructed by Function application, applying and Function composition (computer science), composing Function (computer science), functions. It is a declarat ...
.
* Jukka Paakki
Attribute grammar paradigms—a high-level methodology in language implementation ''ACM Computing Surveys'' 27:2 (June 1995), 196–255.
* Ox is an attribute grammar compiling system that augments
Lex and
Yacc
Yacc (Yet Another Compiler-Compiler) is a computer program for the Unix operating system developed by Stephen C. Johnson. It is a lookahead left-to-right rightmost derivation (LALR) parser generator, generating a LALR parser (the part of a co ...
specifications with definitions of synthesized and inherited attributes written in a combination of Ox and
C/
C++ syntax. From these specifications, Ox generates ordinary Lex and Yacc specifications that build and decorate an attributed
parse tree
A parse tree or parsing tree (also known as a derivation tree or concrete syntax tree) is an ordered, rooted tree that represents the syntactic structure of a string according to some context-free grammar. The term ''parse tree'' itself is use ...
. Ox works with the Lex and Yacc versions distributed in the
Unix
Unix (, ; trademarked as UNIX) is a family of multitasking, multi-user computer operating systems that derive from the original AT&T Unix, whose development started in 1969 at the Bell Labs research center by Ken Thompson, Dennis Ritchie, a ...
and
Solaris operating systems,
Flex, RE/flex,
Bison
A bison (: bison) is a large bovine in the genus ''Bison'' (from Greek, meaning 'wild ox') within the tribe Bovini. Two extant taxon, extant and numerous extinction, extinct species are recognised.
Of the two surviving species, the American ...
,
BYacc,
BtYacc an
MSTA (in the DINO GitHub repository) (See th
SourceForge repository)
Silveris an extensible attribute grammar specification language and system from University of Minnesota. (See also th
GitHub repository)
{{Authority control
Formal languages
Compiler construction
Parsing