COPEX.BNF 3.6 KB
# Keywords, block names and block level names in COPEX are case insensitive.
# "~" is the repetition symbol and Void an alternative to the null string in COPEX.

CopexFile ::=
  {BlankCharacter}
  ::COPEX:: _ {DataElement _ } {Block _} {::COPEX:: _ {DataElement _ } {Block _}}
  ::Goodbye::
  {AnyCharacter}

Block ::=
  BlockLevel _ BlockName {_ DataElement} {_ Block} |
  PrimaryKeyword _ PrimaryValue {_ DataElement} {_ Block} |
  Table(m,n) {_ Block}

Table(m,n) ::=
  PrimaryColumnName _ {ColumnName _}(n-1) UnitRow {_ ColumnValue}(m*n)
  # m >= 1 and n >= 2

PrimaryColumnName ::=
  BlockLevel | PrimaryKeyword

ColumnName ::=
  BlockLevel | PrimaryKeyword | Keyword

UnitRow ::=
  Unit {_ Unit}(n-1) | NoUnits

ColumnValue ::=
  BlockName | PrimaryValue | Value

BlockLevel ::=
  BlockLevelName | BlockLevelFormat

BlockLevelName ::=
  IdentifierLetter {IdentifierLetter | Digit | "_" | "." | "-"} ":"

BlockLevelFormat ::=
  Integer {"." Integer} ":"
  # Number of integers in BlockLevelFormat gives the BlockLevel.

BlockName ::=
  Text  | "~"

PrimaryValue ::=
  Text | "~"

DataElement ::=
  Keyword _ Value [_ Unit]

Keyword ::=
  IdentifierLetter {IdentifierLetter | Digit | "_" | "." | "-"} "="

PrimaryKeyword ::=
  IdentifierLetter {IdentifierLetter | Digit | "_" | "." | "-"} ":="

Unit ::=
  Text | Void

Value :: =
  Text | Real | Void | "~"

Comments ::=
  "/*" {AnyCharacter} "*/" |
  "#" { {VisibleCharacter | Space | CarriageReturn | Tabulator} [IgnoreNewLine] }
  NewLine

Real ::=
  ["+" | "-"] Integer [DecimalSymbol Integer] [ScaleFactor]

DecimalSymbol ::=
  "." | ","

ScaleFactor ::=
  "E" ["+" | "-"] Integer

Integer ::=
  Digit {Digit}

Text ::=
  {VisibleCharacter} OrdinaryCharacter |
  """ { {BlankCharacter | VisibleCharacter | "'"} [IgnoreNewLine] } """ |
  "'" { {BlankCharacter | VisibleCharacter | """} [IgnoreNewLine] } "'"

_ ::=
  BlankCharacter {Comments | BlankCharacter} |
  Comments {Comments | BlankCharacter}

IgnoreNewLine ::=
  "\" NewLine |
  "\" CarriageReturn NewLine

AnyCharacter ::=
  BlankCharacter | VisibleCharacter | QuotationMark

BlankCharacter ::=
  Space | NewLine | CarriageReturn | Tabulator

VisibleCharacter ::=
  OrdinaryCharacter | SpecialCharacter
  # VisibleCharacter does not contain QuotationMark.

OrdinaryCharacter ::=
  Digit | IdentifierLetter | OtherCharacter

SpecialCharacter ::=
  ":" | "=" | "~"

QuotationMark ::=
  """ | "'"

Digit ::=
  "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

IdentifierLetter ::=
  "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" |
  "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" |
  "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" |
  "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" |

OtherCharacter ::=
  "!" | "#" | "$" | "%" | "&" | "(" | ")" | "*" | "+" | "," | "-" | "." | "/" |
  ";" | "<" | ">" | "?" | "@" | "[" | "\" | "]" | "^" | "_" | "`" | "{" | "|" |
  "}" | "¡" | "¢" | "£" | "¤" | "¥" | "¦" | "§" | "¨" | "©" | "ª" | "«" | "¬" |
  "­" | "®" | "¯" | "°" | "±" | "²" | "³" | "´" | "µ" | "¶" | "·" | "¸" | "¹" |
  "º" | "»" | "¼" | "½" | "¾" | "¿" | "À" | "Á" | "Â" | "Ã" | "Ä" | "Å" | "Æ" |
  "Ç" | "È" | "É" | "Ê" | "Ë" | "Ì" | "Í" | "Î" | "Ï" | "Ð" | "Ñ" | "Ò" | "Ó" |
  "Ô" | "Õ" | "Ö" | "×" | "Ø" | "Ù" | "Ú" | "Û" | "Ü" | "Ý" | "Þ" | "ß" | "à" |
  "á" | "â" | "ã" | "ä" | "å" | "æ" | "ç" | "è" | "é" | "ê" | "ë" | "ì" | "í" |
  "î" | "ï" | "ð" | "ñ" | "ò" | "ó" | "ô" | "õ" | "ö" | "÷" | "ø" | "ù" | "ú" |
  "û" | "ü" | "ý" | "þ" | "ÿ"