# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Error definitions. # # Each error definition consists of an error message section, followed by one or # more examples of that error. The examples are used to train the parser to # recognize the error. # # Each error example should contain the token '$ERR' immediately before the # token on which the error is triggered. # # An example may optionally contain the token '$ANY'. If so, the corresponding # error message will be used as a default message for parser errors which occur # in the corresponding parser state. This is roughly equivalent to repeating # the example with every erroneous token in place of the '$ANY'. ================================================================================ A name is required for a struct field. -------------------------------------------------------------------------------- # First example. struct Foo: 0 [+1] UInt $ERR # Missing name (end of struct). --- # Second example -- error on newline token, not comment token. struct Foo: 0 [+1] UInt $ERR ================================================================================ Module attributes must appear before type definitions. -------------------------------------------------------------------------------- struct Foo: 0 [+1] UInt field $ERR [attrib: VALUE] # Attribute after types. ================================================================================ A type name must be CamelCase. -------------------------------------------------------------------------------- struct $ERR foo: # snake_case --- struct $ERR FOO: # SHOUTY --- struct $ERR Foo_: # Not a valid identifier --- bits $ERR foo: --- bits $ERR FOO: --- bits $ERR Foo_: --- enum $ERR foo: --- enum $ERR FOO: --- enum $ERR Foo_: --- external $ERR foo: --- external $ERR FOO: --- external $ERR Foo_: --- bits Type: bits $ERR foo: --- bits Type: bits $ERR FOO: --- bits Type: bits $ERR Foo_: --- bits Type: struct $ERR foo: --- bits Type: struct $ERR FOO: --- bits Type: struct $ERR Foo_: --- bits Type: enum $ERR foo: --- bits Type: enum $ERR FOO: --- bits Type: enum $ERR Foo_: --- bits Type: external $ERR foo: --- bits Type: external $ERR FOO: --- bits Type: external $ERR Foo_: ================================================================================ Expected type name. -------------------------------------------------------------------------------- struct $ERR $ANY --- bits $ERR $ANY --- enum $ERR $ANY --- external $ERR $ANY --- bits Type: bits $ERR $ANY --- bits Type: struct $ERR $ANY --- bits Type: enum $ERR $ANY --- bits Type: external $ERR $ANY ================================================================================ Expected ':' after type name. -------------------------------------------------------------------------------- struct Type $ERR $ANY --- bits Type $ERR $ANY --- enum Type $ERR $ANY --- external Type $ERR $ANY ================================================================================ Expected end of line. -------------------------------------------------------------------------------- struct Type: $ERR $ANY --- bits Type: $ERR $ANY --- enum Type: $ERR $ANY --- external Type: $ERR $ANY --- bits Type: enum Type: $ERR $ANY --- bits Type: struct Type: $ERR $ANY --- bits Type: external Type: $ERR $ANY --- struct Type: enum Type: $ERR $ANY --- struct Type: external Type: $ERR $ANY --- struct Type: bits Type: $ERR $ANY --- bits Type: if false: $ERR $ANY --- struct Type: if false: $ERR $ANY --- struct Type: 0 [+0] bits: $ERR $ANY --- struct Type: if false: 0 [+0] bits: $ERR $ANY --- struct Type: 0 [+0] enum name: $ERR $ANY --- struct Type: if false: 0 [+0] enum name: $ERR $ANY ================================================================================ Expected documentation, an import, a module attribute, or a type at top level. -------------------------------------------------------------------------------- $ERR $ANY ================================================================================ Expected an import, a module attribute, or a type definition. -------------------------------------------------------------------------------- -- doc $ERR $ANY ================================================================================ Expected an import, a module attribute, or a type definition. -------------------------------------------------------------------------------- import "string" as name $ERR $ANY ================================================================================ Imports should follow the form 'import "file_name.emb" as name'. -------------------------------------------------------------------------------- import $ERR $ANY --- import "string" $ERR $ANY --- import "string" as $ERR $ANY ================================================================================ An import statement must be on its own line. -------------------------------------------------------------------------------- import "string" as name $ERR $ANY ================================================================================ Expected inline type definition or field definition. -------------------------------------------------------------------------------- struct Type: external Type: -- $ERR $ANY ================================================================================ Nested type definitions must come before fields. -------------------------------------------------------------------------------- struct Type: VALUE [+0] Type name $ERR struct --- struct Type: VALUE [+0] Type name $ERR enum --- struct Type: VALUE [+0] Type name $ERR bits ================================================================================ Type documentation must come before fields. -------------------------------------------------------------------------------- struct Type: VALUE [+0] Type name $ERR -- doc ================================================================================ Expected field definition. -------------------------------------------------------------------------------- struct Type: VALUE [+0] Type name $ERR $ANY ================================================================================ Expected documentation, attribute, or enum value for inline enum. -------------------------------------------------------------------------------- struct Type: VALUE [+0] enum name: $ERR $ANY ================================================================================ Attributes must be of the form '[name: value]', '[(domain) name: value]', or '[$default name: value]' -------------------------------------------------------------------------------- [ $ERR $ANY --- struct Type: VALUE [+0] Type name [name: $ERR $ANY --- [( $ERR $ANY --- [(name $ERR $ANY --- [(name) $ERR $ANY --- [$default $ERR $ANY --- [name $ERR $ANY --- [name: $ERR $ANY --- [name: VALUE $ERR $ANY --- [name: false $ERR $ANY --- [name: name $ERR $ANY --- [name: "string" $ERR $ANY --- [name: Type $ERR $ANY --- [name: 0 $ERR $ANY ================================================================================ Expected a variable, constant, or expression. -------------------------------------------------------------------------------- # The top-of-stack parser states here are common to expression parsing; the # module-attribute prefix is just the shortest prefix that gets to an # expression. [name: ( $ERR $ANY --- # Yes, '((' puts the parser in a slightly different state than '('. # Fortunately, '(((' and on are equivalent to '(('. [name: (( $ERR $ANY --- [name: + $ERR $ANY --- [name: - $ERR $ANY --- [name: 0 != ( $ERR $ANY --- struct Type: ( $ERR $ANY ================================================================================ Documentation must come before any enumeration values. -------------------------------------------------------------------------------- enum Type: VALUE = VALUE -- $ERR -- doc ================================================================================ Attributes must come before any enumeration values. -------------------------------------------------------------------------------- enum Type: VALUE = VALUE -- $ERR [attribute: value] ================================================================================ Expected 'NAME = value' pair. -------------------------------------------------------------------------------- enum Type: VALUE = VALUE -- $ERR $ANY ================================================================================ Documentation must come before attributes. -------------------------------------------------------------------------------- [name: VALUE] $ERR -- doc --- enum Type: [name: "string"] $ERR -- doc --- external Type: [name: "string"] $ERR -- doc --- struct Type: [name: "string"] $ERR -- doc --- bits Type: [name: "string"] $ERR -- doc ================================================================================ Imports must come before module attributes. -------------------------------------------------------------------------------- [name: VALUE] $ERR import ================================================================================ Expected an attribute or a type definition. -------------------------------------------------------------------------------- [name: VALUE] $ERR $ANY ================================================================================ Expected documentation or attribute for field. (Wrong indent?) -------------------------------------------------------------------------------- struct Type : VALUE [+0] Type name $ERR $ANY ================================================================================ Documentation must come before nested types. -------------------------------------------------------------------------------- struct Type: enum Type: VALUE = VALUE $ERR -- doc ================================================================================ Attributes must come before nested types. -------------------------------------------------------------------------------- struct Type: enum Type: VALUE = VALUE $ERR [ ================================================================================ Expected nested type or field definition. -------------------------------------------------------------------------------- struct Type: enum Type: VALUE = VALUE $ERR $ANY ================================================================================ Documentation must come before field definitions. -------------------------------------------------------------------------------- struct Type: VALUE [+0] Type name -- $ERR -- doc ================================================================================ Attributes must come before field definitions. -------------------------------------------------------------------------------- struct Type: VALUE [+0] Type name -- $ERR [ ================================================================================ Nested types must come before field definitions. -------------------------------------------------------------------------------- struct Type : VALUE [+0] Type name -- $ERR enum --- struct Type : VALUE [+0] Type name -- $ERR struct --- struct Type : VALUE [+0] Type name -- $ERR bits --- struct Type : VALUE [+0] Type name -- $ERR external ================================================================================ Expected field definition. -------------------------------------------------------------------------------- struct Type : VALUE [+0] Type name -- $ERR $ANY ================================================================================ Expected attribute or end of line. -------------------------------------------------------------------------------- struct Type: VALUE [+0] Type name [name: VALUE] $ERR $ANY ================================================================================ Module documentation must come before imports. -------------------------------------------------------------------------------- import "string" as name $ERR -- doc ================================================================================ Body of a type definition must be non-empty and indented. -------------------------------------------------------------------------------- bits Type: $ERR $ANY --- external Type: $ERR $ANY --- struct Type: $ERR $ANY --- enum Type: $ERR $ANY ================================================================================ Expected documentation, attribute, nested type, or field definition. -------------------------------------------------------------------------------- bits Type: $ERR $ANY --- struct Type: $ERR $ANY ================================================================================ Expected documentation or attribute. -------------------------------------------------------------------------------- external Type: $ERR $ANY ================================================================================ Expected documentation, attribute, or enumeration value. -------------------------------------------------------------------------------- enum Type: $ERR $ANY ================================================================================ Enumerations may not contain subtypes. -------------------------------------------------------------------------------- enum Type: $ERR bits --- enum Type: $ERR struct --- enum Type: $ERR external --- enum Type: $ERR enum ================================================================================ Expected operator or closing parenthesis. -------------------------------------------------------------------------------- [name: (name $ERR $ANY --- [name: (VALUE $ERR $ANY --- [name: (false $ERR $ANY --- [name: (0 $ERR $ANY --- [name: ((false) $ERR $ANY ================================================================================ Expected arithmetic operator or closing parenthesis. -------------------------------------------------------------------------------- [name: (0 != 0 $ERR $ANY --- [name: (0 != VALUE $ERR $ANY --- [name: (0 != false $ERR $ANY ================================================================================ Expected arithmetic operator or end of attribute. -------------------------------------------------------------------------------- [name: 0 != VALUE $ERR $ANY --- [name: 0 != 0 $ERR $ANY --- [name: 0 != false $ERR $ANY ================================================================================ Expected operator or '.'. -------------------------------------------------------------------------------- [name: 0 != name $ERR $ANY ================================================================================ Expected operator or closing parenthesis; enumerated values do not have subfields. -------------------------------------------------------------------------------- [name: (VALUE $ERR . ================================================================================ Expected name. -------------------------------------------------------------------------------- [name: Type. $ERR $ANY ================================================================================ Field locations must be of the form 'start [+length]'. Missing '+'? -------------------------------------------------------------------------------- struct Foo: 0 [ $ERR 0 --- struct Foo: 0 [ $ERR name --- struct Foo: 0 [ $ERR VALUE --- struct Foo: 0 [ $ERR Type --- struct Foo: 0 [ $ERR 0 --- struct Foo: 0 [ $ERR name --- struct Foo: 0 [ $ERR VALUE --- struct Foo: 0 [ $ERR Type ================================================================================ Right operand must be an expression. -------------------------------------------------------------------------------- [name: 0 * $ERR $ANY --- [name: 0 + $ERR $ANY --- [name: 0 - $ERR $ANY --- [name: 0 == $ERR $ANY --- [name: 0 != $ERR $ANY --- [name: VALUE * $ERR $ANY --- [name: VALUE + $ERR $ANY --- [name: VALUE - $ERR $ANY --- [name: VALUE == $ERR $ANY --- [name: VALUE != $ERR $ANY ================================================================================ Attribute must appear on its own line. -------------------------------------------------------------------------------- [name: false] $ERR $ANY ================================================================================ Expected subtype or enumeration name. -------------------------------------------------------------------------------- [name: (Type. $ERR $ANY ================================================================================ Attribute missing closing ']'. -------------------------------------------------------------------------------- [name: (0) $ERR ================================================================================ Expected operator or end of attribute. -------------------------------------------------------------------------------- [name: (0) $ERR $ANY ================================================================================ Expected subfield name. -------------------------------------------------------------------------------- [name: (name. $ERR $ANY --- [name: name. $ERR $ANY --- [name: 0 == name. $ERR $ANY ================================================================================ Expected expression for size of field. -------------------------------------------------------------------------------- struct Foo: 0 [+ $ERR $ANY ================================================================================ Unexpected enum name; possibly incorrect indentation. -------------------------------------------------------------------------------- enum Type: VALUE = VALUE -- $ERR VALUE = VALUE ================================================================================ Space is required after '--'. -------------------------------------------------------------------------------- enum Type: VALUE = VALUE -- $ERR --No space ================================================================================ Expected documentation or next value. -------------------------------------------------------------------------------- enum Type: VALUE = VALUE -- $ERR $ANY ================================================================================ Expected '=' after enumerated name. -------------------------------------------------------------------------------- enum Type: VALUE $ERR $ANY ================================================================================ Parentheses are required to mix '&&' and '||'. -------------------------------------------------------------------------------- struct Foo: if a && b && c $ERR || --- struct Foo: if a || b || c $ERR && ================================================================================ Greater-than comparisons may only be chained with equality and greater-than. -------------------------------------------------------------------------------- struct Foo: if a > b $ERR < --- struct Foo: if a > b $ERR <= ================================================================================ Less-than comparisons may only be chained with equality and less-than. -------------------------------------------------------------------------------- struct Foo: if a < b $ERR > --- struct Foo: if a < b $ERR >= ================================================================================ Chained or nested choice operations ('?:') require explicit parentheses. -------------------------------------------------------------------------------- struct Foo: if a ? b : c $ERR ? --- struct Foo: if a ? b $ERR ? ================================================================================ Virtual fields are not allowed in anonymous 'bits' constructs; place them in the enclosing type. -------------------------------------------------------------------------------- struct Foo: 0 [+1] bits: $ERR let x = 0