home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / armbob / doc / !BobDoc_Grammar < prev    next >
Encoding:
Text File  |  1991-09-25  |  7.9 KB  |  298 lines

  1. <TITLE>Grammar for ArmBob 2.0</TITLE>
  2. <H2>Grammar for ArmBob 2.0</H2>
  3. Armbob <A HREF="#Syntax"> Syntax</A> follows that of C, with some 
  4. extensions and some omissions.
  5. Every statement returns a value, including 
  6. assignment statements.
  7. <H4>Comments</H4>
  8. Armbob has two kinds of comment: single- and multi-line. 
  9. They have the same syntax as comments in C++.
  10. <UL>
  11.  <LI>Single-line comments are introduced by <CODE> // </CODE> 
  12.     and are terminated by the end of the line or file.
  13.  <LI>Multi-line comments start with <CODE> /* </CODE> 
  14.      and end with the next <CODE> */ </CODE>. They are 
  15.      not nestable.
  16. </UL>
  17. <H4>Names</H4>
  18. Blank spaces, tab characters and newlines are ignored in 
  19. Armbob, except in so far as they mark the end of a name. 
  20. Names must begin with a letter of the alphabet, and 
  21. subsequently must consist of letters of the alphabet,
  22. digits, or the characters 
  23. <CODE> _ @ $ £ `</CODE> .
  24. <P>
  25. It may be useful, but it is not mandatory, to use 
  26. these extra characters as prefixes or suffixes on names, 
  27. to indicate the type of object they denote, in the 
  28. following way:
  29. <UL>
  30. <LI><CODE>@ </CODE> for addresses of buffers in memory
  31. <LI><CODE>$ </CODE> for strings
  32. <LI><CODE>£ </CODE> for integers or 4-byte words
  33. <LI><CODE>` </CODE> for bytes or characters
  34. </UL>
  35. This mnemonic convention fits the names for the storage 
  36. functions needed for low-level access. Thus, if 
  37. <CODE> s </CODE> is a string, <CODE> @(s) </CODE>
  38. denotes the integer address at which the contents 
  39. of <CODE> s </CODE> are held. If <CODE> a </CODE> is
  40. an address <CODE> $(a) </CODE> denotes the string 
  41. at <CODE> a </CODE>, terminated by a control character,
  42. <CODE> £(a) </CODE> denotes the word stored at 
  43. <CODE> a </CODE>, and <CODE> `(a) </CODE> denotes 
  44. the byte stored at <CODE> a </CODE>.
  45. <P>
  46. Names may be up to 50 characters long. 
  47. Program lines may be up to 200 characters long.
  48. <HR>
  49. <H4><A NAME="Syntax"> Syntax</A></H4>
  50.  
  51. <DL>
  52. <DT><EM>Program</EM> ::= 
  53. <DD>[ Defs ] Main_def [ Defs ]
  54.  
  55. <DT><EM>Defs</EM> ::= 
  56. <DD>Def [ Defs ]
  57.  
  58. <DT><EM>Def</EM> ::= 
  59. <DD>Class_Def | Fun_def
  60.  
  61. <DT><EM>Class_def</EM> ::= 
  62. <DD><CODE>class</CODE> CName 
  63.     [ <CODE>:</CODE> CName ]
  64.     <CODE>{</CODE> Class_body <CODE>}</CODE>
  65.  
  66. <DT><EM>Fun_def</EM> ::= 
  67. <DD>[ CName <CODE>::</CODE> ]
  68.     FName <CODE>(</CODE> [ FArgs ] 
  69.     <CODE>) {</CODE> Fun_body <CODE>}</CODE>
  70.  
  71. <DT><EM>Main_def</EM> ::= 
  72. <DD><CODE>main() {</CODE> Fun_body <CODE>}</CODE>
  73.  
  74. <DT><EM>Class_body</EM> ::= 
  75. <DD>Member <CODE>;</CODE> [ Class_body ]
  76.  
  77. <DT><EM>Member</EM> ::= 
  78. <DD>[<CODE>static</CODE>] Data | [<CODE>static</CODE>]
  79.             FName <CODE>(</CODE> [ FArgs ] <CODE>)</CODE>
  80.  
  81. <DT><EM>Data</EM> ::= 
  82. <DD>Variable [ <CODE>,</CODE> Data ]
  83.  
  84. <DT><EM>FArgs</EM> ::= 
  85. <DD>Variable [ <CODE>,</CODE> FArgs ]
  86.  
  87. <DT><EM>Fun_body</EM> ::= 
  88. <DD>[ <CODE>local</CODE> Args <CODE>;</CODE> ]
  89.                       Statements
  90.  
  91. <DT><EM>Statements</EM> ::= 
  92. <DD>Statement Statements
  93.  
  94. <DT><EM>Statement</EM> ::= 
  95. <DD>[ Single ] <CODE>;</CODE> |
  96.              <CODE>{</CODE> Statements <CODE>}</CODE>
  97.              | Control
  98.  
  99. <DT><EM>Control</EM> ::= 
  100. <DD><CODE>if (</CODE> Expr <CODE>)</CODE>
  101.                    Statement [ <CODE>else</CODE> Statement ]
  102.  
  103. <DD>| <CODE>while (</CODE> Expr <CODE>)</CODE> Statement
  104.  
  105. <DD>| <CODE>do</CODE> Statement <CODE> while (</CODE>
  106.  Expr <CODE>)</CODE>
  107.  
  108. <DD>| <CODE>repeat</CODE> Statement <CODE>until (</CODE>
  109.  Expr <CODE>)</CODE>
  110.  
  111. <DD>| <CODE>do</CODE> Statement <CODE> until (</CODE>
  112.  Expr <CODE>)</CODE>
  113.  
  114. <DD>| <CODE>repeat</CODE> Statement <CODE>while (</CODE>
  115.  Expr <CODE>)</CODE>
  116.  
  117. <DD>| <CODE>for (</CODE> Expr <CODE>;</CODE>
  118.   Expr <CODE>;</CODE> Expr <CODE>)</CODE>
  119.   Statement
  120.  
  121. <DD>| <CODE>switch (</CODE> Expr <CODE>) {</CODE>
  122.   Alternatives [ <CODE>default :</CODE>
  123.   Statements ] <CODE>}</CODE>
  124.  
  125. <DD>| <CODE>in</CODE> Expr <CODE>put {</CODE>
  126.   Items <CODE>}</CODE>
  127.          
  128. <DT><EM>Single</EM> ::= 
  129. <DD><CODE>break</CODE> |
  130.                     <CODE>continue</CODE> |
  131.                     <CODE>return</CODE> Expr | Expr
  132.  
  133. <DT><EM>Items</EM> ::= 
  134. <DD>Expr <CODE>;</CODE> Items
  135.  
  136. <DT><EM>Alternatives</EM> ::= 
  137. <DD><CODE>case</CODE> Expr <CODE>:</CODE>
  138.             Satements Alternatives
  139.  
  140. <DT><EM>Expr</EM> ::= 
  141. <DD>Expr <CODE>,</CODE> Expr
  142.  
  143. <DD>| Lvalue Assign Expr
  144.  
  145. <DD>| Expr <CODE>?</CODE> Expr <CODE>:</CODE> Expr
  146.  
  147. <DD>| Expr Binop Expr
  148.  
  149. <DD>| Unop Expr
  150.  
  151. <DD>| <CODE>++</CODE> Lvalue
  152.  
  153. <DD>| Lvalue <CODE>++</CODE>
  154.  
  155. <DD>| <CODE>--</CODE> Lvalue
  156.  
  157. <DD>| Lvalue <CODE>--</CODE>
  158.  
  159. <DD>| <CODE>new</CODE> Cname <CODE>(</CODE>
  160.   [ Expr ] <CODE>)</CODE>
  161.  
  162. <DD>| Expr <CODE>(</CODE> [ Expr ] <CODE>)</CODE>
  163.  
  164. <DD>| Expr <CODE>-></CODE> Fname <CODE>(</CODE>
  165.   [ Expr ] <CODE>)</CODE>
  166.  
  167. <DD>| Expr <CODE>[</CODE> Expr <CODE>]</CODE>
  168.  
  169. <DD>| <CODE>vector {</CODE> Items <CODE>}</CODE>
  170.  
  171. <DD>| <CODE>enum {</CODE> Data <CODE>}</CODE>
  172.  
  173. <DD>| <CODE>(</CODE> Expr <CODE>)</CODE>
  174.  
  175. <DD>| Variable
  176.  
  177. <DD>| Number
  178.  
  179. <DD>| <CODE>"</CODE>String<CODE>"</CODE>
  180.  
  181. <DD>| <CODE>' </CODE>Character<CODE>'</CODE>
  182.  
  183. <DD>| <CODE>nil</CODE>
  184.  
  185. <DD>| Constant
  186.  
  187. <DT><EM>Assign</EM> ::= 
  188. <DD><CODE> = </CODE> |
  189.                     <CODE> += </CODE> |
  190.                     <CODE> -= </CODE> |
  191.                     <CODE> *= </CODE> |
  192.                     <CODE> /= </CODE> |
  193.                     <CODE> %= </CODE> |
  194.                     <CODE> &= </CODE> |
  195.                     <CODE> |= </CODE> |
  196.                     <CODE> ^= </CODE> |
  197.                     <CODE> <<= </CODE> |
  198.                     <CODE> >>= </CODE>
  199.  
  200. <DT><EM>Binop</EM> ::= 
  201. <DD><CODE>|| </CODE> |
  202.                    <CODE>| </CODE> | 
  203.                    <CODE> && </CODE> |
  204.                    <CODE> & </CODE> |
  205.                    <CODE> ^ </CODE> |
  206.                    <CODE> == </CODE> |
  207.                    <CODE> != </CODE> |
  208.                    <CODE> < </CODE> |
  209.                    <CODE> <= </CODE> |
  210.                    <CODE> > </CODE> |
  211.                    <CODE> >=</CODE> | 
  212.                    <CODE> >></CODE> |
  213.                    <CODE> <<</CODE> | 
  214.                    <CODE> + </CODE> |
  215.                    <CODE> - </CODE> |
  216.                    <CODE> * </CODE> |
  217.                    <CODE> % </CODE> |
  218.                    <CODE> / </CODE>
  219.  
  220. <DT><EM>Unop</EM> ::= 
  221. <DD><CODE> - </CODE> 
  222.                 | <CODE> ! </CODE>
  223.                 | <CODE> ~ </CODE>        
  224.  
  225. <DT><EM>Lvalue</EM> ::= 
  226. <DD>Variable 
  227.                   | Expr <CODE>[</CODE> Expr <CODE>]</CODE>
  228.  
  229. <DT><EM>Number</EM> ::= 
  230. <DD>Decimal[<CODE>.</CODE>decimal]
  231.                   | <CODE>&</CODE>Hexnumber
  232.  
  233. <DT><EM>Decimal</EM> ::= 
  234. <DD>DigitDecimal
  235.  
  236. <DT><EM>Hexnumber</EM> ::= 
  237. <DD>HexdigitHexnumber
  238.  
  239. <DT><EM>Digit</EM> ::= 
  240. <DD><CODE>0</CODE>
  241.                  | <CODE>1</CODE>
  242.                  | <CODE>2</CODE>
  243.                  | <CODE>3</CODE>
  244.                  | <CODE>4</CODE>
  245.                  | <CODE>5</CODE>
  246.                  | <CODE>6</CODE>
  247.                  | <CODE>7</CODE>
  248.                  | <CODE>8</CODE>
  249.                  | <CODE>9</CODE>
  250.  
  251. <DT><EM>Hexdigit></EM> ::= 
  252. <DD>Digit
  253.                     | <CODE>a</CODE>
  254.                     | <CODE>b</CODE>
  255.                     | <CODE>c</CODE>
  256.                     | <CODE>d</CODE>
  257.                     | <CODE>e</CODE>
  258.                     | <CODE>f</CODE>
  259.  
  260. <DT><EM>Character</EM> ::= 
  261. <DD>Char | <CODE>"</CODE>
  262.  
  263. <DT><EM>String</EM> ::= 
  264. <DD>CharString
  265.  
  266. <DT><EM>Char</EM> ::= 
  267. <DD><CODE>\n</CODE>
  268.                 | <CODE>\t</CODE>
  269.                 | <CODE>\\</CODE> 
  270.      | Any ASCII character except ", \ or control code
  271.  
  272. <DT><EM>Cname</EM> ::= 
  273. <DD>Identifier
  274.  
  275. <DT><EM>Fname</EM> ::= 
  276. <DD>Identifier
  277.  
  278. <DT><EM>Variable</EM> ::= 
  279. <DD>Identifier
  280.  
  281. <DT><EM>Identifier</EM> ::= 
  282. <DD>Alpha | Digit
  283.  
  284. <DT><EM>Alpha</EM> ::= 
  285. <DD>[<CODE>A-Z</CODE>]
  286.                  | [<CODE>a-z</CODE>]
  287.                  | <CODE>_</CODE>
  288.                  | <CODE>@</CODE>
  289.                  | <CODE>$</CODE>
  290.                  | <CODE>£</CODE>
  291.                  | <CODE>`</CODE>
  292. </DL>
  293.  
  294. The non-terminal <EM>Constant</EM> reduces to the terminals listed as
  295. <A HREF="synonyms"> synonyms</A>.
  296.  
  297.  
  298.