126 lines
3.4 KiB
Python
126 lines
3.4 KiB
Python
from collections import namedtuple
|
|
|
|
grammar = r"""
|
|
file: "ISO-10303-21;" header data_section "END-ISO-10303-21;"
|
|
header: "HEADER" ";" header_entity_list "ENDSEC" ";"
|
|
header_line: (SPECIAL|DIGIT|LOWER|UPPER)* "*"
|
|
data_section: "DATA" ";" (entity_instance)* "ENDSEC" ";"
|
|
entity_instance: simple_entity_instance|complex_entity_instance
|
|
simple_entity_instance: id "=" simple_record ";"
|
|
complex_entity_instance: id "=" subsuper_record ";"
|
|
subsuper_record : "(" simple_record_list ")"
|
|
simple_record_list:simple_record simple_record*
|
|
simple_record: keyword "("parameter_list?")"
|
|
header_entity_list: file_description file_name file_schema
|
|
file_description: "FILE_DESCRIPTION" "(" parameter_list ")" ";"
|
|
file_name: "FILE_NAME" "(" parameter_list ")" ";"
|
|
file_schema: "FILE_SCHEMA" "(" parameter_list ")" ";"
|
|
id: /#[0-9]+/
|
|
keyword: /[A-Z][0-9A-Z_]*/
|
|
parameter: untyped_parameter|typed_parameter|omitted_parameter
|
|
parameter_list: parameter ("," parameter)*
|
|
list: "(" parameter ("," parameter)* ")" |"("")"
|
|
typed_parameter: keyword "(" parameter ")"|"()"
|
|
untyped_parameter: string| NONE |INT |REAL |enumeration |id |binary |list
|
|
omitted_parameter:STAR
|
|
enumeration: "." keyword "."
|
|
binary: "\"" ("0"|"1"|"2"|"3") (HEX)* "\""
|
|
string: "'" (REVERSE_SOLIDUS REVERSE_SOLIDUS|SPECIAL|DIGIT|SPACE|LOWER|UPPER|CONTROL_DIRECTIVE|"\\*\\")* "'"
|
|
|
|
STAR: "*"
|
|
SLASH: "/"
|
|
NONE: "$"
|
|
SPECIAL : "!"
|
|
| "*"
|
|
| "$"
|
|
| "%"
|
|
| "&"
|
|
| "."
|
|
| "#"
|
|
| "+"
|
|
| ","
|
|
| "-"
|
|
| "("
|
|
| ")"
|
|
| "?"
|
|
| "/"
|
|
| ":"
|
|
| ";"
|
|
| "<"
|
|
| "="
|
|
| ">"
|
|
| "@"
|
|
| "["
|
|
| "]"
|
|
| "{"
|
|
| "|"
|
|
| "}"
|
|
| "^"
|
|
| "`"
|
|
| "~"
|
|
| "_"
|
|
| "\""
|
|
| "\"\""
|
|
| "''"
|
|
REAL: SIGN? DIGIT (DIGIT)* "." (DIGIT)* ("E" SIGN? DIGIT (DIGIT)* )?
|
|
INT: SIGN? DIGIT (DIGIT)*
|
|
CONTROL_DIRECTIVE: PAGE | ALPHABET | EXTENDED2 | EXTENDED4 | ARBITRARY
|
|
PAGE : REVERSE_SOLIDUS "S" REVERSE_SOLIDUS LATIN_CODEPOINT
|
|
LATIN_CODEPOINT : SPACE | DIGIT | LOWER | UPPER | SPECIAL | REVERSE_SOLIDUS | APOSTROPHE
|
|
ALPHABET : REVERSE_SOLIDUS "P" UPPER REVERSE_SOLIDUS
|
|
EXTENDED2: REVERSE_SOLIDUS "X2" REVERSE_SOLIDUS (HEX_TWO)* END_EXTENDED
|
|
EXTENDED4 :REVERSE_SOLIDUS "X4" REVERSE_SOLIDUS (HEX_FOUR)* END_EXTENDED
|
|
END_EXTENDED: REVERSE_SOLIDUS "X0" REVERSE_SOLIDUS
|
|
ARBITRARY: REVERSE_SOLIDUS "X" REVERSE_SOLIDUS HEX_ONE
|
|
HEX_FOUR: HEX_TWO HEX_TWO
|
|
HEX_TWO: HEX_ONE HEX_ONE
|
|
HEX_ONE: HEX HEX
|
|
HEX: "0"
|
|
| "1"
|
|
| "2"
|
|
| "3"
|
|
| "4"
|
|
| "5"
|
|
| "6"
|
|
| "7"
|
|
| "8"
|
|
| "9"
|
|
| "A"
|
|
| "B"
|
|
| "C"
|
|
| "D"
|
|
| "E"
|
|
| "F"
|
|
APOSTROPHE: "'"
|
|
REVERSE_SOLIDUS: "\\"
|
|
DIGIT: "0".."9"
|
|
SIGN: "+"|"-"
|
|
LOWER: "a".."z"
|
|
UPPER: "A".."Z"
|
|
ESCAPE : "\\" ( "$" | "\"" | CHAR )
|
|
CHAR : /[^$"\n]/
|
|
WORD : CHAR+
|
|
SPACE.10 : " "
|
|
|
|
%ignore /[ \t\f\r\n]/+
|
|
"""
|
|
|
|
HEADER_FIELDS = {
|
|
"file_description": namedtuple(
|
|
"file_description", ["description", "implementation_level"]
|
|
),
|
|
"file_name": namedtuple(
|
|
"file_name",
|
|
[
|
|
"name",
|
|
"time_stamp",
|
|
"author",
|
|
"organization",
|
|
"preprocessor_version",
|
|
"originating_system",
|
|
"authorization",
|
|
],
|
|
),
|
|
"file_schema": namedtuple("file_schema", ["schema_identifiers"]),
|
|
}
|