blob: d95efe69e62822e2b0cecf225a70208e5f5be0c3 [file] [log] [blame]
[/==============================================================================
Copyright (C) 2001-2010 Joel de Guzman
Copyright (C) 2001-2010 Hartmut Kaiser
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section Style Guide]
At some point, especially when there are lots of semantic actions attached to
various points, the grammar tends to be quite difficult to follow. In order to
keep an easy-to-read, consistent and aesthetically pleasing look to the Spirit
code, the following coding style guide is advised.
This coding style is adapted and extended from the ANTLR\/PCCTS style and
[@http://www.boost.org/development/requirements.html Boost Library Requirements
and Guidelines] and is the combined work of Joel de Guzman, Chris Uzdavinis,
and Hartmut Kaiser.
* Rule names use std C++ (Boost) convention. The rule name may be very long.
* The '=' is neatly indented 4 spaces below. Like in Boost, use spaces instead
of tabs.
* Breaking the operands into separate lines puts the semantic actions neatly
to the right.
* Semicolon at the last line terminates the rule.
* The adjacent parts of a sequence should be indented accordingly to have all,
what belongs to one level, at one indentation level.
program
= program_heading [heading_action]
>> block [block_action]
>> '.'
| another_sequence
>> etc
;
* Prefer literals in the grammar instead of identifiers. e.g. `"program"` instead
of `PROGRAM`, `'>='` instead of `GTE` and `'.'` instead of `DOT`. This makes it much
easier to read. If this isn't possible (for instance where the used tokens
must be identified through integers) capitalized identifiers should be used
instead.
* Breaking the operands may not be needed for short expressions.
e.g. `*(',' >> file_identifier)` as long as the line does not
exceed 80 characters.
* If a sequence fits on one line, put spaces inside the parentheses
to clearly separate them from the rules.
program_heading
= no_case["program"]
>> identifier
>> '('
>> file_identifier
>> *( ',' >> file_identifier )
>> ')'
>> ';'
;
* Nesting directives: If a rule does not fit on one line (80 characters)
it should be continued on the next line intended by one level. The brackets
of directives, semantic expressions (using Phoenix or LL lambda expressions)
or parsers should be placed as follows.
identifier
= no_case
[
lexeme
[
alpha >> *(alnum | '_') [id_action]
]
]
;
* Nesting unary operators (e.g.Kleene star): Unary rule operators
(Kleene star, `'!'`, `'+'` etc.) should be moved out one space before
the corresponding indentation level, if this rule has a body or a
sequence after it, which does not fit on on line. This makes the
formatting more consistent and moves the rule 'body' at the same
indentation level as the rule itself, highlighting the unary operator.
block
= *( label_declaration_part
| constant_definition_part
| type_definition_part
| variable_declaration_part
| procedure_and_function_declaration_part
)
>> statement_part
;
[endsect]