|
|
1.1 ! root 1: % run this through LaTeX with the appropriate wrapper ! 2: ! 3: \chapter {Pepy Optional Structure-Generator}\label{posy} ! 4: The \man posy(1) program is a compiler for specifications of abstract ! 5: syntaxes. ! 6: ! 7: For those interested in trivia, ! 8: \pgm{posy} stands for ! 9: \underbar{P}epy ! 10: \underbar{O}ptional ! 11: \underbar{S}tructure-generator ! 12: (\underbar{Y}ACC-based). ! 13: The \man pepy(1) program is an ASN.1 compiler, ! 14: and the \man yacc(1) program, ! 15: of course, ! 16: is a compiler-compiler. ! 17: ! 18: \section {Abstract Syntax Module} ! 19: The \pgm{posy} program reads a description of an {\em abstract syntax ! 20: module\/} ! 21: and produces the corresponding {\em C\/} structures along with an augmented ! 22: abstract syntax module. ! 23: ! 24: The syntax of the input file corresponds almost exactly to the notation ! 25: described in \cite{ISO.PP.Syntax,CCITT.PP.Syntax}. ! 26: (But see Section~\ref{posy:deficiencies} on page~\pageref{posy:deficiencies} ! 27: for the details.) ! 28: As the ASN.1 language is rich in its notation, ! 29: the rules are not presented herein, ! 30: though Section~\ref{asn1:notation} on page~\pageref{asn1:notation} of \volone/ ! 31: presents an incomplete treatment of the less substantive aspects of the ! 32: language. ! 33: ! 34: An example of a complete abstract syntax module can be found in ! 35: Figure~\ref{POSexample} starting on page~\pageref{POSexample}. ! 36: This corresponds to the output produced by \man rosy(1) when given ! 37: the remote operations module in Figure~\ref{ROSexample} as input. ! 38: ! 39: For our purposes, ! 40: the input file is relatively unimportant as it is usually generated by the ! 41: \pgm{rosy} program. ! 42: Hence, ! 43: the output from \pgm{posy} is where this chapter focuses. ! 44: ! 45: \newpage ! 46: \tagrindfile{grindposy-1}{Example of an Abstract Syntax Module}{POSexample} ! 47: \newpage ! 48: ! 49: \section {POSY Environment} ! 50: The \pgm{posy} program will produce two files after reading its abstract ! 51: syntax module. ! 52: ! 53: \subsection {C Language Structures}\label{posy:c-struct} ! 54: For each type in the abstract syntax module, ! 55: \pgm{posy} will define a corresponding {\em C\/} language structure ! 56: (\verb"struct"). ! 57: ! 58: The rules that \pgm{posy} uses to generate the structures are fairly simple: ! 59: \begin{describe} ! 60: \item [\verb"BOOLEAN":] represented as a \verb"char". ! 61: ! 62: \item [\verb"INTEGER":] represented as an \verb"int". ! 63: If the \verb"INTEGER" type has a list of tagged values, ! 64: then for each value: ! 65: \begin{quote}\small\begin{verbatim} ! 66: #define int_MODULE_TYPE_TAG value ! 67: \end{verbatim}\end{quote} ! 68: as in: ! 69: \begin{quote}\small\begin{verbatim} ! 70: #define int_IMAGE_IntList_zero 0 ! 71: \end{verbatim}\end{quote} ! 72: ! 73: \item [\verb"BIT STRING":] represented as a \verb"struct PElement" ! 74: (these are described in Section~\ref{psap:bits} of \volone/). ! 75: If the \verb"BIT STRING" type has a list of tagged bits, ! 76: then for each bit: ! 77: \begin{quote}\small\begin{verbatim} ! 78: #define bit_MODULE_TYPE_TAG value ! 79: \end{verbatim}\end{quote} ! 80: as in: ! 81: \begin{quote}\small\begin{verbatim} ! 82: #define bit_IMAGE_Version_version__1 0 ! 83: \end{verbatim}\end{quote} ! 84: In addition, one other definition is present: ! 85: \begin{quote}\small\begin{verbatim} ! 86: #define bits_MODULE_TYPE string ! 87: \end{verbatim}\end{quote} ! 88: as in: ! 89: \begin{quote}\small\begin{verbatim} ! 90: #define bits_IMAGE_Version "\020\01version-1" ! 91: \end{verbatim}\end{quote} ! 92: ! 93: \item [\verb"OCTET STRING":] represented as a \verb"struct qbuf" ! 94: (these are described in Section~\ref{psap:qbuf} of \volone/ ! 95: and Section~\ref{tsap:qbuf} of \voltwo/). ! 96: ! 97: \item [\verb"REAL":] represented as a \verb"double". ! 98: ! 99: \item [\verb"NULL":] represented as a \verb"char". ! 100: ! 101: \item [\verb"SEQUENCE"/\verb"SET"/\verb"ANY":] ! 102: represented as a \verb"struct PElement" ! 103: (which are described throughout Chapter~\ref{libpsap} of \volone/). ! 104: This format is used for those \verb"SEQUENCE"s or \verb"SET"s which ! 105: contain no elements. ! 106: ! 107: \item [\verb"SEQUENCE OF"/\verb"SET OF":] ! 108: by default, represented as a \verb"struct" with two elements, ! 109: a linked-list. ! 110: The first element is the type for set or sequence, ! 111: the second element is a pointer to another instance of the structure. ! 112: For example: ! 113: \begin{quote}\small\begin{verbatim} ! 114: SEQUENCE OF ! 115: Format ! 116: \end{verbatim}\end{quote} ! 117: might be translated as: ! 118: \begin{quote}\small\begin{verbatim} ! 119: struct element_IMAGE_4 { ! 120: struct type_IMAGE_Format *Format; ! 121: ! 122: struct element_IMAGE_4 *next; ! 123: }; ! 124: \end{verbatim}\end{quote} ! 125: By using the \switch"h2" option (described below), ! 126: an array structure can be generated instead. ! 127: ! 128: \item [\verb"SEQUENCE"/\verb"SET":] represented as a simple \verb"struct" ! 129: with an element for each member. ! 130: For example: ! 131: \begin{quote}\small\begin{verbatim} ! 132: Mail-Address ::= SEQUENCE { ! 133: local[0] ! 134: IMPLICIT GraphicString, ! 135: ! 136: domain[1] ! 137: IMPLICIT GraphicString, ! 138: ! 139: options[2] ! 140: IMPLICIT BITSTRING ! 141: } ! 142: \end{verbatim}\end{quote} ! 143: might be translated as: ! 144: \begin{quote}\small\begin{verbatim} ! 145: struct type_IMAGE_Mail__Address { ! 146: struct type_UNIV_GraphicString *local; ! 147: ! 148: struct type_UNIV_GraphicString *domain; ! 149: ! 150: PE options; ! 151: }; ! 152: \end{verbatim}\end{quote} ! 153: ! 154: \item [\verb"CHOICE":] represented as a \verb"struct" containing an ! 155: \verb"int" and a \verb"union". ! 156: \begin{quote}\small\begin{verbatim} ! 157: CHOICE { ! 158: file-name[0] ! 159: IMPLICIT Filename, ! 160: ! 161: mail-address[1] ! 162: IMPLICIT Mail-Address ! 163: } ! 164: \end{verbatim}\end{quote} ! 165: might be translated as: ! 166: \begin{quote}\small\begin{verbatim} ! 167: struct choice_IMAGE_0 { ! 168: int offset; ! 169: #define choice_IMAGE_0_file__name 1 ! 170: #define choice_IMAGE_0_mail__address 2 ! 171: ! 172: union { ! 173: struct type_IMAGE_Filename *file__name; ! 174: ! 175: struct type_IMAGE_Mail__Address *mail__address; ! 176: } un; ! 177: }; ! 178: \end{verbatim}\end{quote} ! 179: ! 180: \item [\verb"OBJECT IDENTIFIER":] represented as a \verb"struct OIDentifier" ! 181: (these are described in Section~\ref{psap:oid} of \volone/). ! 182: ! 183: \item [\verb"MODULE.TYPE":] represented as a pointer to a ! 184: \verb"struct" \verb"type_MODULE_TYPE". ! 185: \end{describe} ! 186: ! 187: Although these rules might seem complicated, ! 188: in point of fact they are actually very straight-forward and regular. ! 189: The easiest way to gain familiarity with them is to run some abstract syntax ! 190: modules through \pgm{posy} and then view the resulting definitions. ! 191: Figure~\ref{CStructs} starting on page~\pageref{CStructs} presents the ! 192: {\em C\/} language structures corresponding to the abstract syntax module in ! 193: Figure~\ref{POSexample}. ! 194: ! 195: \subsubsection {Controlling the names that POSY generates} ! 196: One of the least friendly aspects of \pgm{posy} is the algorithm ! 197: it uses for choosing the names of {\em C\/} language structures being ! 198: generated. ! 199: The rules for choosing some names are fixed, ! 200: i.e., the top-level name generated for an ASN.1 type can not be changed. ! 201: However, ! 202: the names used for the parts of the \verb"struct"s generated by \pgm{posy} can ! 203: be controlled~---~to an extent using either (or both) of two techniques. ! 204: ! 205: The first method takes advantage of the observation that \pgm{posy} uses ! 206: commentary tags in the ASN.1 definition, whenever possible, as variable names. ! 207: To revisit an earlier example: ! 208: \begin{quote}\small\begin{verbatim} ! 209: Mail-Address ::= SEQUENCE { ! 210: local[0] ! 211: IMPLICIT GraphicString, ! 212: ! 213: domain[1] ! 214: IMPLICIT GraphicString, ! 215: ! 216: options[2] ! 217: IMPLICIT BITSTRING ! 218: } ! 219: \end{verbatim}\end{quote} ! 220: might be translated as: ! 221: \begin{quote}\small\begin{verbatim} ! 222: struct type_IMAGE_Mail__Address { ! 223: struct type_UNIV_GraphicString *local; ! 224: ! 225: struct type_UNIV_GraphicString *domain; ! 226: ! 227: PE options; ! 228: }; ! 229: \end{verbatim}\end{quote} ! 230: In each case, the names of the variables (e.g., \verb"local") were taken from ! 231: the commentary tag. ! 232: Note that if no tag is present, ! 233: \pgm{posy} must choose a name in a different fashion. ! 234: Hence, ! 235: the first level of control is to simply add short, descriptive commentary tags ! 236: to the remote operations module (the \pgm{rosy} program will preserve the ! 237: ASN.1 when it generates an abstract syntax module. ! 238: ! 239: The second method is to augment the remote operations module with the ! 240: \verb"%[ ... %]" construct. ! 241: This construct allows the user to select both the name used for ! 242: intermediate structures that are generated and the name used for the ! 243: corresponding variable in certain cases. ! 244: Consider: ! 245: \begin{quote}\small\begin{verbatim} ! 246: ReadImage-INV ::= SEQUENCE { ! 247: ... ! 248: ! 249: SEQUENCE OF %[ format_list $ head %] ! 250: FORMAT ! 251: ! 252: ... ! 253: } ! 254: \end{verbatim}\end{quote} ! 255: might be translated as: ! 256: \begin{quote}\small\begin{verbatim} ! 257: struct type_IMAGE_ReadImage__INV { ! 258: ... ! 259: ! 260: struct format_list { ! 261: struct type_IMAGE_Format *element_IMAGE_4; ! 262: ! 263: struct format_list *next; ! 264: } *head; ! 265: ! 266: ... ! 267: }; ! 268: \end{verbatim}\end{quote} ! 269: More formally, ! 270: the ! 271: \begin{quote}\small\begin{verbatim} ! 272: %[ structure-name $ variable-name %] ! 273: \end{verbatim}\end{quote} ! 274: construct can be used to control the names used when generating intermediate ! 275: structures. ! 276: The construct can be used with any of these ASN.1 constructs: ! 277: \begin{itemize} ! 278: \item \verb"SEQUENCE %[ ... %]" ! 279: \item \verb"SEQUENCE OF %[ ... %]" ! 280: \item \verb"SEQUENCE %[ ... %] { ... }" ! 281: \item \verb"SET %[ ... %]" ! 282: \item \verb"SET OF %[ ... %]" ! 283: \item \verb"SET %[ ... %] { ... }" ! 284: \item \verb"CHOICE %[ ... %] { ... }" ! 285: \end{itemize} ! 286: If the \verb"$ variable-name" portion of the construct is missing, ! 287: then only the structure name is taken from the construct, ! 288: the name of the corresponding variable is generated in the usual fashion. ! 289: ! 290: NOTE: This facility is only allowed in the use of nested constructs. It is ! 291: not possible to override the names chosen for the top level constructs as ! 292: this would break the inheritence of structures names from other modules. ! 293: E.g. ! 294: \begin{quote}\small\begin{verbatim} ! 295: Defn ::= SEQUENCE %[ ... %] { ... ! 296: \end{verbatim}\end{quote} ! 297: is not supported but ! 298: \begin{quote}\small\begin{verbatim} ! 299: Defn ::= SEQUENCE { ! 300: SEQUENCE OF %[ ... %] Thing, ! 301: ... ! 302: \end{verbatim}\end{quote} ! 303: is. ! 304: ! 305: \subsection {Augmented Abstract Syntax Module} ! 306: In addition to the definition of {\em C\/} language structures, ! 307: \pgm{posy} will prepare an augmented abstract syntax module for use with the ! 308: \man pepy(1) program. ! 309: With this augmented module, ! 310: \pgm{pepy} will generate {\em C\/} code to translate {\em C\/} structures to ! 311: and from their corresponding abstract syntax. ! 312: As this is entirely an automatic process, ! 313: the contents of the augmented abstract syntax module are relatively ! 314: unimportant. ! 315: ! 316: \newpage ! 317: \tagrindfile{grindposy-2}{Example of C Language Structures}{CStructs} ! 318: \newpage ! 319: ! 320: \section {Known Deficiences}\label{posy:deficiencies} ! 321: \pgm{posy} uses essentially the same front-end as the \man pepy(1) program, ! 322: so it has some limitations in the ASN.1 syntax it can accept. ! 323: Consult Section~\ref{pepy:syntax} for the details. ! 324: ! 325: When generating the augmented abstract syntax module for \pgm{pepy}, ! 326: \pgm{posy} has a well-defined set of rules. ! 327: There are, however, some aspects which are still incomplete or subject to ! 328: change: ! 329: \begin{itemize} ! 330: \item On determining if an \verb"OPTIONAL" element is present, ! 331: for elements represented by a pointer (e.g., an \verb"OCTET STRING" ! 332: and its corresponding \verb"struct qbuf" pointer), ! 333: if the pointer is non-\verb"NULL" (non-zero valued), ! 334: then the element is considered to be present. ! 335: ! 336: \item For elements which are represented by a scalar and not a pointer ! 337: (e.g., an \verb"INTEGER" and its corresponding \verb"int"), ! 338: an additional element, \verb"optionals", is created in the ! 339: structure. This is a ! 340: bitmask value, with each bit indicating whether a particular ! 341: element is present or not. So for optional element, a test is ! 342: first required to see if this element is really present. e.g., ! 343: \begin{quote}\small\begin{verbatim} ! 344: if (element -> optionals & opt_element_member1) ! 345: /* process element -> member1 */ ! 346: \end{verbatim}\end{quote} ! 347: ! 348: \end{itemize} ! 349: ! 350: \section {Running POSY} ! 351: Here are a few things to know when running \pgm{posy}. ! 352: ! 353: \subsection {Options}\label{posy:options} ! 354: The \pgm{posy} program has a few options to modify its behavior. ! 355: ! 356: The \switch"a" switch directs \pgm{posy} to augment the \verb"#include" file ! 357: it generates with commentary text. ! 358: ! 359: Normally, \pgm{posy} ignores all \pgm{pepy}-style augmentations except the ! 360: ``verbatim'' actions occuring at the very beginning and end of the module. ! 361: The \switch"d" switch directs \pgm{posy} to ignore the verbatim actions as ! 362: well. ! 363: ! 364: The \switch"f" switch directs \pgm{posy} to generate {\em C\/} routines to ! 365: deallocate the structures it defines ! 366: (e.g., for type \verb"type_MODULE_type", ! 367: a routine called \verb"free_MODULE_type" is defined). ! 368: These are appended to the augmented module definition ! 369: (as a consequence, ! 370: use of the \switch"f" switch forces use of the \switch"d" switch). ! 371: ! 372: The \switch"h" switch enables additional heuristics when \pgm{posy} generates ! 373: a {\em C\/} language structure definition. ! 374: These heuristics are used to make the \verb"struct"s more concise. ! 375: For example, ! 376: compare the definitions in Figure~\ref{CStructs} with those in ! 377: Figure~\ref{H0Structs} starting on page~\pageref{H0Structs}. ! 378: Both were derived from the abstract syntax module in Figure~\ref{POSexample}, ! 379: but the definitions in Figure~\ref{H0Structs} was generated using the ! 380: \switch"h0" switch. ! 381: The current wisdom is that use of the \switch"h0" switch is a good thing. ! 382: Enabling any other option also results in enabling option \switch"h0". ! 383: ! 384: The \switch"h1" switch ! 385: enables ``clever'' but non-unique structure naming. ! 386: Use of the \switch"h1" switch is {\bf not\/} recommended. ! 387: ! 388: The \switch"h2" switch enables the generation of arrays rather than ! 389: linked-lists whenever possible. ! 390: For example, ! 391: compare the definitions in Figure~\ref{CStructs} with the fragment in ! 392: Figure~\ref{H2Structs} on page~\pageref{H2Structs}. ! 393: Both were derived from the abstract syntax module in Figure~\ref{POSexample}, ! 394: but the fragment in Figure~\ref{H2Structs} was generated using the ! 395: \switch"h2" switch. ! 396: The current wisdom makes no pronouncement as to whether the \switch"h2" switch ! 397: is a good thing: some people prefer linked-lists, others perfer arrays. ! 398: ! 399: The \switch"o" switch sets the name of the output file. ! 400: If this switch is not specified, ! 401: the standard output is used ! 402: (\pgm{posy} can not derive the name of the output file from the input file ! 403: since both should have extension \verb".py"). ! 404: ! 405: Normally, \pgm{posy} prints the name of each type as it works. ! 406: The \switch"s" switch disables this behavior. ! 407: ! 408: \subsection {Makefiles}\label{posy:make} ! 409: By convention, ! 410: input files to \pgm{posy} have the extension \verb".py". ! 411: This causes something of a problem with \man make(1) as the augmented ! 412: abstract syntax module which \pgm{posy} outputs should also have an extension ! 413: of \verb"py". ! 414: ! 415: Since \pgm{posy} can not intuit the name of the output file from the input ! 416: file, ! 417: rather than starting with file \verb"module.py", ! 418: we assume we are starting with file \verb"MODULE-asn.py". ! 419: (Hence the reason for the complexity in Section~\ref{rosy:make}.) ! 420: Let us arbitrarily select the file named \verb"MODULE-types.py" for the ! 421: augmented abstract syntax module produced by \pgm{posy}. ! 422: Hence ! 423: \begin{quote}\begin{verbatim} ! 424: posy -o MODULE-types.py MODULE-asn.py ! 425: \end{verbatim}\end{quote} ! 426: will produce: ! 427: \begin{describe} ! 428: \item[\verb"MODULE-types.py":] the augmented abstract syntax module; ! 429: and, ! 430: ! 431: \item[\verb"MODULE-types.h":] the {\em C\/} language structures. ! 432: \end{describe} ! 433: ! 434: Our \man make(1) rules are: ! 435: \begin{quote}\small\begin{verbatim} ! 436: MODULE-types.py: MODULE-asn.py ! 437: posy $(POFLAGS) -o $@ MODULE-asn.rpy ! 438: MODULE-types.h: MODULE-types.py ! 439: \end{verbatim}\end{quote} ! 440: Usually \verb"POFLAGS" is set to ``\verb"-f -h"''. ! 441: ! 442: In our particular discipline, ! 443: we will generate two sets of files: ! 444: one for the invoker and the other for the performer. ! 445: \begin{quote}\small\begin{verbatim} ! 446: MODULE-Rtypes.c: MODULE-types.py ! 447: pepy -a PY_advise $(PYFLAGS) -o $@ MODULE-types.py ! 448: ! 449: MODULE-Itypes.c: MODULE-types.py ! 450: pepy $(PYFLAGS) -o $@ MODULE-types.py ! 451: \end{verbatim}\end{quote} ! 452: ! 453: \newpage ! 454: \tagrindfile{grindposy-3}{Example of C Language Structures (with -h0)}% ! 455: {H0Structs} ! 456: ! 457: \newpage ! 458: \tagrindfile{grindposy-4}{Example of C Language Structures (with -h2)}% ! 459: {H2Structs}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.