Since we do not have scoping implemented, we allow any identifier to be a type name as well (since locally scoped identifiers may shadow type names). However, this causes the following cases of ambiguity:
- a
unary_expression
of the typesizeof(char)
. Either the brackets are parsed with thesizeof
token, or they become part of aprimary_expression
with the identifier namedchar
. - a
cast_expression
of the type((__uint16_t) ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)))
. The(__uint16_t)
may be parsed as apostfix_expression
and the expression in brackets following as an argument to a function call. - a
declaration
of the typesqlite3_mutex *pMutex;
. It may be interpreted as anexpression_statement
consisting of a multiplication. This causes ambiguity in the parsing ofcompound_statement
s.
Type signatures of the parses generated by each of the above ambiguities can be found at the end.
We address the issue brought up by the attempt to express typedef
semantics in this framework.
We use the same definitions for
- an identifier bound by a
$\mu$ -rule has global scope – it can be used by any other rule in the grammar. - if a bound identifier is under a
$*$ , or a sequence of multiple identical expressions, it is bound to a list of the strings that each copy matches (this is inspired by Lean4'sTSepArray
semantics).
These features help us to define C's typedef
in this framework, with scoping. We do it as follows:
declaration <- μ("typedef" type_spec $(ident, n) ";" / ...,
[type_name :-> %n / γ(type_name)])
compound_statement <- μ("{" declaration* statement* "}",
[type_name :-> !%n ; γ(type_name)])
Note that if n
did not have global scope, we would (a) have to copy the entire RHS of declaration
into the rule for compound_statement
, and (b) not be able to refer to the bound names at the end of the compound statement.
Note on 14 Aug: This can be done more simply and elegantly by using nonterminals as scopes in reference.
typedef_nont <- "typedef" type_specifier $(ident, n) ";"
declaration <- μ(typedef_nont / ... ,
[type_name :-> %typedef_nont:n / γ(type_name)])
compound_statement <- μ("{" declaration* statement* "}",
[type_name :-> !%declaration:typedef_nont:n ; γ(type_name)])
!%n
, whenn
is a list, has the semantics of!n1 !n2 ...
. How to generalise this to other combinators applie to lists? Is this hacky?%n
refers in the RHS ofdeclaration
to a single name, but in the RHS ofcompound_statement
to a list of names, sincedeclaration
is under a*
there. Is this acceptable?
In order to avoid involving a function with an infinite input space (which we don't provide the infrastructure to define), we take inspiration from Lean4's macro_rules
command and allow expressions in grammar to refer back to subexpressions they match with.
In essence, we define four new combinators:
-
$\mu : \text{PEG} \times \text{NT} \times \text{PEG} \to \text{PEG}$ . An expression$\mu(E, T, E')$ has the semantics that after$E$ is parsed, the production rule associated with$T$ takes$E'$ as its new RHS. - $$ : \text{PEG} \times \Sigma* \to \text{PEG}$. This is a sort of antiquotation combinator. If the expression $$(E_1, n)$ occurs in the first argument of
$\mu$ , then$n$ can be used to refer to the string of terminals associated with$E$ in the parse. -
$% : \Sigma* \to \text{PEG}$ . This complements the $$$ combinator. If$%n$ occurs in the third argument of$\mu$ , it indicates the string of terminals associated with the expression bound to$n$ by $$$ in the first argument. [Note on 14 Aug: Use the nonterminal in which the identifier is bound as a kind of scope (see the example of C above).] -
$\gamma : \text{NT} \to \text{PEG}$ . This gives access to the production associated with a nonterminal before the modification.
- What if we want to refer to the string associated with a subexpression of the one bound by $$$ (see the C example below)?
- (related but may not have the same solution) Should we allow any nonterminal to refer to a name bound anywhere else in the grammar?
Consider the typedef
statement. We define the expansion of the declaration
nonterminal as follows:
declaration <- μ("typedef" type_specifier $(ident, n) ";",
type_name_token,
%n / γ(type_name_token))
This has the effect of adding the identifier referred to by n
to the beginning of the RHS of type_name_token
.
However, the problem of ending a scope is more difficult. We know that if we want type_name_token
to not include foo
anymore, say, we can simply let
!("foo"); γ(t)
But at the end of a scope, we do not have access to the identifier that we want removed.
Note to self: this may be solvable by using
We can do this by allowing multiple modifications within a single μ. Consider the following
declaration <- μ("typedef" type_specifier $(ident, n) ";",
{type_name_token :-> %n / γ(type_name_token),
compound_statement :-> μ(γ(compound_statement),
{type_name_token :-> !(%n) γ(type_name_token)})})
We describe here a tentative way to define a modifiable (we avoid the term extensible) reformulation of PEG theory, in a way that retains its most useful properties.
A modifiable grammar
and
Note that PEG
here refers to the type of PEG expressions, constructed using nonterminals, terminals, and the combinators of sequence, repetition, lookahead and prioritised choice.
The ruleset
We define the domain to be
Some production rules have the additional semantics that whenever their expansion is successfully used to parse a string (giving an AST
where
The
As it is, we can now claim (?) that the parsing will not exceed linear time, as the processing time for a program with
- In the above we describe the functions
$\mu, \Lambda$ by their signatures, but we do not give a structural way to define them. If we allow arbitrary functions for$\mu$ and$\Lambda$ , we will not be able to reason about (nor prove anything) about the class of grammars we define: e.g. how do we know that$\mu$ doesn't require us to solve the halting problem for deciding how to change the grammar? - It's unclear wether we want
$\Lambda : \text{AST} \to \text{PEG}$ or vice-versa,$\Lambda : \text{PEG} \to \text{AST}$ . Morally we want the former, but it is not clear how we'd define this for arbitrary $AST$s. The latter allows us to know precisely what combinators we want to expose on the grammar. - To address the above two points, we would ideally want to define extensions to
$\text{PEG}$ (i.e. the meta-grammar) that allow us to construct these operators. For example, an operator$\rho : { /, *, ! } \to \text{AST}$ that allows us to reflect the$\text{PEG}$ combinators in the grammar. How we'd define$\mu$ is still unclear.
We know that typedef statements are declaration
s. So we let the production rule defined as
declaration <- declaration_specifiers init_declarator_list ';'
have the modifying semantics described above, and define
Then we need to specify only
void (*foo)(int)
returns foo
. Thus the tree structure is reduced.
type_name_token
.
We can consider the case of statements of the form
syntax num <|> (arith op num) <|> "(" arith ")" : arith
Here again, we only need :
, and <|>
, seq
, literals) to PEG combinators (prioritised choice, sequencing, terminals). This preserves tree structure, and so is valid.
For unary_expression
s, an example of the ambiguity is
(choice
(«unary_expressionSizeof(_)»
"sizeof"
"("
(type_name__ (specifier_qualifier_list_ (specifier_qualifier_ (type_specifierChar "char"))) [])
")")
(unary_expressionSizeof_
"sizeof"
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_ (postfix_expression_ (primary_expression__4 "char"))))))))))))))))])
")")))))
for the expression sizeof(char)
.
For cast_expression
s, an example is
(choice
(cast_expression_
(unary_expression_
(«postfix_expression_(_)»
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__1 (type_name_token__uint16_t "__uint16_t")))))))))))))))))])
")"))
"("
(«argument_expression_list_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(«inclusive_or_expression_|_»
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(«and_expression_&_»
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(«shift_expression_>>_»
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression_
`__bsx))))))))))))))))])
")")))))))
">>"
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___
(num "8")
[(arith_type_specs "")])))))))))))))))))])
")"))))))))))
"&"
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___ (num "0xff") [(arith_type_specs "")])))))))))))))))))])
")"))))))))))))
"|"
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(«shift_expression_<<_»
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(«and_expression_&_»
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression_
`__bsx))))))))))))))))])
")"))))))))))
"&"
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___
(num "0xff")
[(arith_type_specs "")])))))))))))))))))])
")")))))))
"<<"
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___ (num "8") [(arith_type_specs "")])))))))))))))))))])
")"))))))))))))))))])
")")))
(«cast_expression(_)_»
"("
(type_name__
(specifier_qualifier_list_ (specifier_qualifier_ (type_specifier__2 (type_name_token__uint16_t "__uint16_t"))))
[])
")"
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(«inclusive_or_expression_|_»
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(«and_expression_&_»
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(«shift_expression_>>_»
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression_
`__bsx))))))))))))))))])
")")))))))
">>"
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___
(num "8")
[(arith_type_specs "")])))))))))))))))))])
")"))))))))))
"&"
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___ (num "0xff") [(arith_type_specs "")])))))))))))))))))])
")"))))))))))))
"|"
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(«shift_expression_<<_»
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(«and_expression_&_»
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression_
`__bsx))))))))))))))))])
")"))))))))))
"&"
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___
(num "0xff")
[(arith_type_specs "")])))))))))))))))))])
")")))))))
"<<"
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___ (num "8") [(arith_type_specs "")])))))))))))))))))])
")"))))))))))))))))])
")"))))))
for the expression ((__uint16_t) ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)))
.
For compound_statement
s, an example is
(choice
(«compound_statement{__}»
"{"
(declaration_list_
(«declaration__;»
(declaration_specifiers__1 (type_specifier__2 (type_name_tokenSqlite3_mutex "sqlite3_mutex")))
[(«init_declarator_list_,,»
[(«init_declarator_=_» (declarator__ [(«pointer*__» "*" [] [])] (direct_declarator_ `pMutex)) [])])]
";"))
(statement_list__
(statement__2 («expression_statement_;» [(«expression_,,» [])] ";"))
(statement_list__
(statement__3
(«selection_statementIf(_)_Else_»
"if"
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(«logical_or_expression_||_»
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(«relational_expression_<_»
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_ (unary_expression_ (postfix_expression_ (primary_expression_ `op))))))))
"<"
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression__2 (extended_num___ (num "0") [])))))))))))))))
"||"
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(«relational_expression_>=_»
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_ (unary_expression_ (postfix_expression_ (primary_expression_ `op))))))))
">="
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(«cast_expression(_)_»
"("
(type_name__
(specifier_qualifier_list_ (specifier_qualifier_ (type_specifierInt "int")))
[])
")"
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(«multiplicative_expression_/_»
(multiplicative_expression_
(cast_expression_
(unary_expressionSizeof_
"sizeof"
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression_
`sqlite3Stat.nowValue))))))))))))))))])
")"))))))
"/"
(cast_expression_
(unary_expressionSizeof_
"sizeof"
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_[_]»
(postfix_expression_
(primary_expression_
`sqlite3Stat.nowValue))
"["
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___
(num "0")
[(arith_type_specs
"")])))))))))))))))))])
"]")))))))))))))))])
")")))))))))))))))))])
")")))))))))))))))))])
")"))))))))))))))))])
")"
(statement__1
(«compound_statement{_}»
"{"
(statement_list_
(statement__5
(«jump_statementReturn_;»
"return"
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_(_)»
(postfix_expression_ (primary_expression_ `sqlite3MisuseError))
"("
(«argument_expression_list_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___ (num "23373") [(arith_type_specs "")])))))))))))))))))])
")")))))))))))))))])
";")))
"}"))
[]))
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression___
(unary_expression_ (postfix_expression_ (primary_expression_ `pMutex)))
(«assignment_operator=» "=")
(assignment_expression_
(«conditional_expression_?_:_»
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_[_]»
(postfix_expression_ (primary_expression_ `statMutex))
"["
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression_ `op))))))))))))))))])
"]")))))))))))))
"?"
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(choice
(«postfix_expression_(_)»
(postfix_expression_ (primary_expression_ `sqlite3Pcache1Mutex))
"("
(«argument_expression_list_,,» [])
")")
(«postfix_expression_()»
(postfix_expression_ (primary_expression_ `sqlite3Pcache1Mutex))
"("
")"))))))))))))))))])
":"
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(choice
(«postfix_expression_(_)»
(postfix_expression_ (primary_expression_ `sqlite3MallocMutex))
"("
(«argument_expression_list_,,» [])
")")
(«postfix_expression_()»
(postfix_expression_ (primary_expression_ `sqlite3MallocMutex))
"("
")"))))))))))))))))))])]
";"))
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_(_)»
(postfix_expression_ (primary_expression_ `sqlite3_mutex_enter))
"("
(«argument_expression_list_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression_ `pMutex))))))))))))))))])
")")))))))))))))))])]
";"))
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression___
(unary_expression___1
(«unary_operator*» "*")
(cast_expression_ (unary_expression_ (postfix_expression_ (primary_expression_ `pCurrent)))))
(«assignment_operator=» "=")
(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_[_]»
(postfix_expression_ (primary_expression_ `sqlite3Stat.nowValue))
"["
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression_ `op))))))))))))))))])
"]"))))))))))))))))])]
";"))
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression___
(unary_expression___1
(«unary_operator*» "*")
(cast_expression_ (unary_expression_ (postfix_expression_ (primary_expression_ `pHighwater)))))
(«assignment_operator=» "=")
(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_[_]»
(postfix_expression_ (primary_expression_ `sqlite3Stat.mxValue))
"["
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression_ `op))))))))))))))))])
"]"))))))))))))))))])]
";"))
(statement_list__
(statement__3
(«selection_statementIf(_)_Else_»
"if"
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_ (postfix_expression_ (primary_expression_ `resetFlag))))))))))))))))])
")"
(statement__1
(«compound_statement{_}»
"{"
(statement_list_
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression___
(unary_expression_
(«postfix_expression_[_]»
(postfix_expression_ (primary_expression_ `sqlite3Stat.mxValue))
"["
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_ (postfix_expression_ (primary_expression_ `op))))))))))))))))])
"]"))
(«assignment_operator=» "=")
(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_[_]»
(postfix_expression_ (primary_expression_ `sqlite3Stat.nowValue))
"["
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression_ `op))))))))))))))))])
"]"))))))))))))))))])]
";")))
"}"))
[]))
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_(_)»
(postfix_expression_ (primary_expression_ `sqlite3_mutex_leave))
"("
(«argument_expression_list_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression_ `pMutex))))))))))))))))])
")")))))))))))))))])]
";"))
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(«cast_expression(_)_»
"("
(type_name__
(specifier_qualifier_list_ (specifier_qualifier_ (type_specifierVoid "void")))
[])
")"
(cast_expression_
(unary_expression_ (postfix_expression_ (primary_expression_ `pMutex)))))))))))))))))])]
";"))
(statement_list_
(statement__5
(«jump_statementReturn_;»
"return"
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___ (num "0") [(arith_type_specs "")])))))))))))))))))])
";"))))))))))))
"}")
(«compound_statement{_}»
"{"
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(«multiplicative_expression_*_»
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression__1 (type_name_tokenSqlite3_mutex "sqlite3_mutex"))))))
"*"
(cast_expression_
(unary_expression_ (postfix_expression_ (primary_expression_ `pMutex))))))))))))))))])]
";"))
(statement_list__
(statement__2 («expression_statement_;» [(«expression_,,» [])] ";"))
(statement_list__
(statement__3
(«selection_statementIf(_)_Else_»
"if"
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(«logical_or_expression_||_»
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(«relational_expression_<_»
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_ (unary_expression_ (postfix_expression_ (primary_expression_ `op))))))))
"<"
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression__2 (extended_num___ (num "0") [])))))))))))))))
"||"
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(«relational_expression_>=_»
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_ (unary_expression_ (postfix_expression_ (primary_expression_ `op))))))))
">="
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(«cast_expression(_)_»
"("
(type_name__
(specifier_qualifier_list_ (specifier_qualifier_ (type_specifierInt "int")))
[])
")"
(cast_expression_
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(«multiplicative_expression_/_»
(multiplicative_expression_
(cast_expression_
(unary_expressionSizeof_
"sizeof"
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression_
`sqlite3Stat.nowValue))))))))))))))))])
")"))))))
"/"
(cast_expression_
(unary_expressionSizeof_
"sizeof"
(unary_expression_
(postfix_expression_
(«primary_expression(_)»
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_[_]»
(postfix_expression_
(primary_expression_
`sqlite3Stat.nowValue))
"["
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___
(num "0")
[(arith_type_specs
"")])))))))))))))))))])
"]")))))))))))))))])
")")))))))))))))))))])
")")))))))))))))))))])
")"))))))))))))))))])
")"
(statement__1
(«compound_statement{_}»
"{"
(statement_list_
(statement__5
(«jump_statementReturn_;»
"return"
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_(_)»
(postfix_expression_ (primary_expression_ `sqlite3MisuseError))
"("
(«argument_expression_list_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___ (num "23373") [(arith_type_specs "")])))))))))))))))))])
")")))))))))))))))])
";")))
"}"))
[]))
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression___
(unary_expression_ (postfix_expression_ (primary_expression_ `pMutex)))
(«assignment_operator=» "=")
(assignment_expression_
(«conditional_expression_?_:_»
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_[_]»
(postfix_expression_ (primary_expression_ `statMutex))
"["
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression_ `op))))))))))))))))])
"]")))))))))))))
"?"
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(choice
(«postfix_expression_(_)»
(postfix_expression_ (primary_expression_ `sqlite3Pcache1Mutex))
"("
(«argument_expression_list_,,» [])
")")
(«postfix_expression_()»
(postfix_expression_ (primary_expression_ `sqlite3Pcache1Mutex))
"("
")"))))))))))))))))])
":"
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(choice
(«postfix_expression_(_)»
(postfix_expression_ (primary_expression_ `sqlite3MallocMutex))
"("
(«argument_expression_list_,,» [])
")")
(«postfix_expression_()»
(postfix_expression_ (primary_expression_ `sqlite3MallocMutex))
"("
")"))))))))))))))))))])]
";"))
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_(_)»
(postfix_expression_ (primary_expression_ `sqlite3_mutex_enter))
"("
(«argument_expression_list_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression_ `pMutex))))))))))))))))])
")")))))))))))))))])]
";"))
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression___
(unary_expression___1
(«unary_operator*» "*")
(cast_expression_ (unary_expression_ (postfix_expression_ (primary_expression_ `pCurrent)))))
(«assignment_operator=» "=")
(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_[_]»
(postfix_expression_ (primary_expression_ `sqlite3Stat.nowValue))
"["
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression_ `op))))))))))))))))])
"]"))))))))))))))))])]
";"))
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression___
(unary_expression___1
(«unary_operator*» "*")
(cast_expression_ (unary_expression_ (postfix_expression_ (primary_expression_ `pHighwater)))))
(«assignment_operator=» "=")
(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_[_]»
(postfix_expression_ (primary_expression_ `sqlite3Stat.mxValue))
"["
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression_ `op))))))))))))))))])
"]"))))))))))))))))])]
";"))
(statement_list__
(statement__3
(«selection_statementIf(_)_Else_»
"if"
"("
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_ (postfix_expression_ (primary_expression_ `resetFlag))))))))))))))))])
")"
(statement__1
(«compound_statement{_}»
"{"
(statement_list_
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression___
(unary_expression_
(«postfix_expression_[_]»
(postfix_expression_ (primary_expression_ `sqlite3Stat.mxValue))
"["
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_ (postfix_expression_ (primary_expression_ `op))))))))))))))))])
"]"))
(«assignment_operator=» "=")
(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_[_]»
(postfix_expression_ (primary_expression_ `sqlite3Stat.nowValue))
"["
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression_ `op))))))))))))))))])
"]"))))))))))))))))])]
";")))
"}"))
[]))
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(«postfix_expression_(_)»
(postfix_expression_ (primary_expression_ `sqlite3_mutex_leave))
"("
(«argument_expression_list_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_ (primary_expression_ `pMutex))))))))))))))))])
")")))))))))))))))])]
";"))
(statement_list__
(statement__2
(«expression_statement_;»
[(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(«cast_expression(_)_»
"("
(type_name__
(specifier_qualifier_list_ (specifier_qualifier_ (type_specifierVoid "void")))
[])
")"
(cast_expression_
(unary_expression_ (postfix_expression_ (primary_expression_ `pMutex)))))))))))))))))])]
";"))
(statement_list_
(statement__5
(«jump_statementReturn_;»
"return"
(«expression_,,»
[(assignment_expression_
(conditional_expression_
(logical_or_expression_
(logical_and_expression_
(inclusive_or_expression_
(exclusive_or_expression_
(and_expression_
(equality_expression_
(relational_expression_
(shift_expression_
(additive_expression_
(multiplicative_expression_
(cast_expression_
(unary_expression_
(postfix_expression_
(primary_expression__2
(extended_num___ (num "0") [(arith_type_specs "")])))))))))))))))))])
";")))))))))))))
"}"))
for the expression
{
sqlite3_mutex *pMutex;
;
if( op<0 || op>=((int)(sizeof(sqlite3Stat.nowValue)/sizeof(sqlite3Stat.nowValue[0]))) ){
return sqlite3MisuseError(23373);
}
pMutex = statMutex[op] ? sqlite3Pcache1Mutex() : sqlite3MallocMutex();
sqlite3_mutex_enter(pMutex);
*pCurrent = sqlite3Stat.nowValue[op];
*pHighwater = sqlite3Stat.mxValue[op];
if( resetFlag ){
sqlite3Stat.mxValue[op] = sqlite3Stat.nowValue[op];
}
sqlite3_mutex_leave(pMutex);
(void)pMutex;
return 0;
}