diff tests/agcl/contrib/plm.syn @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/agcl/contrib/plm.syn	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,757 @@
+/* YACC parser for PL/M syntax.
+
+$Id: plm.syn,v 1.1 2007/04/05 06:29:19 dholland Exp $
+From: plm-parse.y,v 1.1 1994/02/28 20:54:56 hays Exp
+
+Copyright 1994 by Kirk Hays (hays@ichips.intel.com) and Gary Funck
+(gary@intrepid.com)
+
+USE AT YOUR OWN RISK. NO WARRANTY EXPRESSED OR IMPLIED.
+This code is distributed in the hope that it will be useful,
+but without any warranty.  Further, there is no implied warranty of
+merchantability or fitness for a particular purpose.
+
+*/
+
+/* This file defines the grammar of PL/M. */
+
+
+{
+
+
+/*
+ * YACC grammar of PL/M
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include "plm-manifest.h"
+#include "scope.h"
+
+void yyerror ();
+
+/* Cause the `yydebug' variable to be defined.  */
+#define YYDEBUG (1)
+
+
+}
+ADDRESS = "address"
+AND = "and"
+ASSIGN_OP = ":="
+AT = "at"
+AT_SIGN = '@'
+BASED = "based"
+BY = "by"
+BYTE = "byte"
+CALL = "call"
+CASE = "case"
+CAUSE_INTERRUPT = "causeInterrupt"
+CHARINT = "charint"
+COLON = ':'
+COMMA = ','
+DATA = "data"
+DECLARE = "declare"
+DISABLE = "disable"
+DO  = "do"
+DOT = '.'
+DWORD = "dword"
+ELSE = "else"
+ENABLE = "enable"
+END = "end"
+EOF_KW = "eof"
+EQ = '='
+EXTERNAL = "external"
+GE = ">="
+GO = "go"
+GOTO = "goto"
+GT = '>'
+HALT = "halt"
+HWORD = "hword"
+IF = "if"
+INITIAL_KW = "initial"
+INTEGER = "integer"
+INTERRUPT = "interupt"
+LABEL = "label"
+LE = "<="
+LITERALLY = "literally"
+LONGINT = "longint"
+LPAREN = '('
+LT = '<'
+MINUS = "minus"
+MINUS_SIGN = '-'
+MOD = "mod"
+NE = "<>"
+NOT = "not"
+OFFSET = "offset"
+OR = "or"
+PLUS = "plus"
+PLUS_SIGN = '+'
+POINTER = "pointer"
+PROCEDURE = "procedure"
+PUBLIC = "public"
+QWORD = "qword"
+REAL = "real"
+REENTRANT = "reentrant"
+RETURN = "return"
+RPAREN = ')'
+SELECTOR = "selector"
+SEMI = ';'
+SHORTINT = "shortint"
+SLASH  = '/'
+STAR = '*'
+STRUCTURE = "structure"
+THEN = "then"
+TO = "to"
+WHILE = "while"
+WORD = "word"
+XOR = "xor"
+
+[
+  grammar token = compilation
+  case sensitive = OFF
+  disregard white space
+  distinguish lexemes
+  lexeme {numeric_constant, IDENTIFIER, STRING}
+]
+
+eof = -1 + 0 + ^D + ^Z
+
+white space
+ -> ' ' + '\t' + '\r' + '\f' + '\v' + '\n'
+ -> "/*", ~eof?..., "*/"
+
+actual_parameters
+ -> LPAREN, expression_list, RPAREN
+
+adding_operator
+ -> MINUS
+ -> MINUS_SIGN
+ -> PLUS
+ -> PLUS_SIGN
+
+and_operator
+ -> AND
+
+arithmetic_expression
+ -> term
+ -> arithmetic_expression, adding_operator, term
+
+array_specifier
+ -> explicit_dimension
+ -> implicit_dimension
+
+assignment_statement
+ -> left_part, EQ, expression, SEMI
+
+base_specifier
+ -> IDENTIFIER
+ -> IDENTIFIER, DOT, IDENTIFIER
+
+basic_statement
+ -> assignment_statement
+ -> call_statement
+ -> goto_statement
+ -> microprocessor_dependent_statement
+ -> null_statement
+ -> return_statement
+
+basic_type
+ -> ADDRESS
+ -> BYTE
+ -> CHARINT
+ -> DWORD
+ -> HWORD
+ -> INTEGER
+ -> LONGINT
+ -> OFFSET
+ -> POINTER
+ -> QWORD
+ -> REAL
+ -> SELECTOR
+ -> SHORTINT
+ -> WORD
+
+bound_expression
+ -> expression
+
+by_part
+ -> BY, step_expression
+
+call_statement
+ -> CALL, simple_variable, SEMI
+ -> CALL, simple_variable, actual_parameters, SEMI
+
+cast_type
+ -> basic_type
+
+cause_interrupt_statement
+ -> CAUSE_INTERRUPT, LPAREN, integer_constant, RPAREN, SEMI
+
+compilation
+ -> module, eof
+ -> module, EOF_KW, eof
+
+conditional_clause
+ -> if_condition, true_unit
+ -> if_condition, true_element, ELSE, false_element
+
+constant
+ -> STRING
+ -> numeric_constant
+
+constant_attribute
+ -> DATA
+
+constant_list
+ -> constant
+ -> constant_list, COMMA, constant
+
+declaration
+ -> declare_statement
+ -> procedure_definition
+
+declaration_sequence
+ -> declaration
+ -> declaration_sequence, declaration
+
+declare_element
+ -> factored_element
+ -> unfactored_element
+
+declare_element_list
+ -> declare_element
+ -> declare_element_list, COMMA, declare_element
+
+declare_statement
+ -> DECLARE, declare_element_list, SEMI
+
+disable_statement
+ -> DISABLE, SEMI
+
+do_block
+ -> do_case_block
+ -> do_while_block
+ -> iterative_do_block
+ -> simple_do_block
+
+do_case_block
+ -> do_case_statement, ending
+ -> do_case_statement, unit_sequence, ending
+
+do_case_statement
+ -> DO, CASE, expression, SEMI ={
+                                 push_scope();
+                                }
+
+do_while_block
+ -> do_while_statement, ending
+ -> do_while_statement, unit_sequence, ending
+
+do_while_statement
+ -> DO, WHILE, expression, SEMI ={
+                                  push_scope();
+                                 }
+
+embedded_assignment
+ -> variable_reference, ASSIGN_OP, logical_expression
+
+enable_statement
+ -> ENABLE, SEMI
+
+end_statement
+ -> END, opt_identifier, SEMI ={
+                                 pop_scope();
+                                }
+ending
+ -> end_statement
+ -> label_definition_sequence, end_statement
+
+explicit_dimension
+ -> LPAREN, numeric_constant, RPAREN
+
+expression
+ -> embedded_assignment
+ -> logical_expression
+
+expression_list
+ -> expression
+ -> expression_list, COMMA, expression
+
+factored_element
+ -> factored_label_element
+ -> factored_variable_element
+
+/*
+ * factored_label_element doesn't permit based variables,
+ * yet factored_variable_element does.  This can't be disambiguated
+ * syntactically.  Thus, the factored_label element will have to
+ * make the proper semantic checks to make the sure that the
+ * variable_name_specifier_list is in fact an identifier_list.
+ */
+
+factored_label_element
+ -> LPAREN, variable_name_specifier_list, RPAREN, LABEL, opt_public_or_external
+
+factored_member
+ -> LPAREN, member_name_list, RPAREN, opt_explicit_dimension, variable_type
+
+factored_variable_element
+ -> LPAREN, variable_name_specifier_list, RPAREN, opt_explicit_dimension, variable_type, opt_variable_attributes
+
+false_element
+ -> unit
+
+formal_parameter
+ -> IDENTIFIER
+
+formal_parameter_list
+ -> formal_parameter
+ -> formal_parameter_list, COMMA, formal_parameter
+
+formal_parameter_specifier
+ -> LPAREN, formal_parameter_list, RPAREN
+
+go_to
+ -> GOTO
+ -> GO, TO
+
+goto_statement
+ -> go_to, IDENTIFIER, SEMI
+
+halt_statement
+ -> HALT, SEMI
+
+id_colon
+ -> IDENTIFIER, COLON
+
+if_condition
+ -> IF, expression, THEN
+
+implicit_dimension
+ -> LPAREN, STAR, RPAREN
+
+index_part
+ -> index_variable, EQ, start_expression
+
+index_variable
+ -> simple_variable
+
+initial_value
+ -> expression
+
+initial_value_list
+ -> initial_value
+ -> initial_value_list, COMMA, initial_value
+
+initialization
+ -> DATA, LPAREN, initial_value_list, RPAREN
+ -> INITIAL_KW, LPAREN, initial_value_list, RPAREN
+
+integer_constant
+ -> binary number
+ -> decimal number
+ -> hex number
+ -> octal number
+
+interrupt
+ -> INTERRUPT, opt_interrupt_number
+
+interrupt_number
+ -> integer_constant
+
+iterative_do_block
+ -> iterative_do_statement, ending
+ -> iterative_do_statement, unit_sequence, ending
+
+iterative_do_statement
+ -> DO, index_part, to_part, opt_by_part, SEMI ={
+                                                push_scope();
+                                               }
+label_definition
+ -> id_colon
+
+label_definition_sequence
+ -> label_definition
+ -> label_definition_sequence, label_definition
+
+label_element
+ -> IDENTIFIER, LABEL, opt_public_or_external
+
+left_part
+ -> variable_reference_list
+
+literal_element
+ -> IDENTIFIER, LITERALLY, STRING ={
+                                          enter_literal ($1, $3);
+                                        }
+
+location_reference
+ -> AT_SIGN, variable_reference
+ -> AT_SIGN, LPAREN, constant_list, RPAREN
+ -> DOT, variable_reference
+ -> DOT, LPAREN, constant_list, RPAREN
+
+locator
+ -> AT, LPAREN, expression, RPAREN
+
+locator_initialization
+ -> locator
+ -> initialization
+ -> locator, initialization
+
+logical_expression
+ -> logical_factor
+ -> logical_expression, or_operator, logical_factor
+
+logical_factor
+ -> logical_secondary
+ -> logical_factor, and_operator, logical_secondary
+
+logical_primary
+ -> arithmetic_expression
+ -> arithmetic_expression, relation_operator, arithmetic_expression
+
+logical_secondary
+ -> logical_primary
+ -> NOT, logical_primary
+
+member_element
+ -> structure_type
+ -> factored_member
+ -> unfactored_member
+
+member_element_list
+ -> member_element
+ -> member_element_list, COMMA, member_element
+
+member_name
+ -> IDENTIFIER
+
+member_name_list
+ -> member_name
+ -> member_name_list, COMMA, member_name
+
+member_specifier
+ -> DOT, member_name
+ -> DOT, member_name, subscript
+
+member_specifier_sequence
+ -> member_specifier_sequence, member_specifier
+ -> member_specifier
+
+microprocessor_dependent_statement
+ -> cause_interrupt_statement
+ -> disable_statement
+ -> enable_statement
+ -> halt_statement
+
+module
+ -> module_name, COLON, simple_do_block
+
+module_name
+ -> IDENTIFIER
+
+multiplying_operator
+ -> MOD
+ -> SLASH
+ -> STAR
+
+null_statement
+ -> SEMI
+
+numeric_constant
+ -> floating point number
+ -> integer_constant
+
+opt_array_specifier
+ ->         /* empty */
+ -> array_specifier
+
+opt_by_part
+ ->         /* empty */
+ -> by_part
+
+opt_explicit_dimension
+ ->         /* empty */
+ -> explicit_dimension
+
+opt_formal_parameter_specifier
+ ->         /* empty */
+ -> formal_parameter_specifier
+
+opt_identifier
+ ->         /* empty */
+ -> IDENTIFIER
+
+opt_interrupt_number
+ ->         /* empty */
+ -> interrupt_number
+
+opt_procedure_attribute_sequence
+ ->         /* empty */
+ -> procedure_attribute_sequence
+
+opt_procedure_type
+ ->         /* empty */
+ -> procedure_type
+
+opt_public_or_external
+ ->         /* empty */
+ -> EXTERNAL
+ -> PUBLIC
+
+opt_variable_attributes
+ ->         /* empty */
+ -> variable_attributes
+
+or_operator
+ -> OR
+ -> XOR
+
+primary
+ -> constant
+ -> location_reference
+ -> subexpression
+ -> variable_reference
+
+procedure_attribute
+ -> EXTERNAL
+ -> PUBLIC
+ -> REENTRANT
+ -> interrupt, PUBLIC
+ -> interrupt, EXTERNAL
+
+procedure_attribute_sequence
+ -> procedure_attribute
+ -> procedure_attribute_sequence, procedure_attribute
+
+procedure_definition
+ -> procedure_statement, ending
+ -> procedure_statement, declaration_sequence, ending
+ -> procedure_statement, unit_sequence, ending
+ -> procedure_statement, declaration_sequence, unit_sequence, ending
+
+procedure_statement
+ -> id_colon, PROCEDURE, opt_formal_parameter_specifier, opt_procedure_type, opt_procedure_attribute_sequence, SEMI ={
+                 push_scope();
+                }
+
+procedure_type
+ -> basic_type
+
+relation_operator
+ -> EQ
+ -> GE
+ -> GT
+ -> LE
+ -> LT
+ -> NE
+
+return_statement
+ -> typed_return
+ -> untyped_return
+
+secondary
+ -> primary
+ -> unary_sign, primary
+
+simple_do_block
+ -> simple_do_statement, ending
+ -> simple_do_statement, unit_sequence, ending
+ -> simple_do_statement, declaration_sequence, ending
+ -> simple_do_statement, declaration_sequence, unit_sequence, ending
+
+simple_do_statement
+ -> DO, SEMI ={
+                 push_scope();
+                }
+
+simple_variable
+ -> IDENTIFIER
+ -> IDENTIFIER, DOT, IDENTIFIER
+
+start_expression
+ -> expression
+
+step_expression
+ -> expression
+
+structure_type
+ -> STRUCTURE, LPAREN, member_element_list, RPAREN
+
+subexpression
+ -> LPAREN, expression, RPAREN
+
+subscript
+ -> LPAREN, expression, RPAREN
+
+subscript_or_actual_parameters
+ -> LPAREN, expression_list, RPAREN
+
+term
+ -> secondary
+ -> term, multiplying_operator, secondary
+
+to_part
+ -> TO, bound_expression
+
+true_element
+ -> true_statement
+ -> label_definition_sequence, true_statement
+
+true_statement
+ -> do_block
+ -> basic_statement
+
+true_unit
+ -> unit
+
+typed_return
+ -> RETURN, expression, SEMI
+
+unary_minus
+ -> MINUS_SIGN
+
+unary_plus
+ -> PLUS_SIGN
+
+unary_sign
+ -> unary_minus
+ -> unary_plus
+
+unfactored_element
+ -> label_element
+ -> literal_element
+ -> variable_element
+
+unfactored_member
+ -> member_name, opt_explicit_dimension, variable_type
+
+unit
+ -> unit_element
+ -> label_definition_sequence, unit_element
+
+unit_element
+ -> basic_statement
+ -> conditional_clause
+ -> do_block
+
+unit_sequence
+ -> unit
+ -> unit_sequence, unit
+
+untyped_return
+ -> RETURN, SEMI
+
+variable_attributes
+ -> EXTERNAL, constant_attribute
+ -> EXTERNAL
+ -> PUBLIC, locator_initialization
+ -> PUBLIC
+ -> locator_initialization
+
+variable_element
+ -> variable_name_specifier, opt_array_specifier, variable_type, opt_variable_attributes
+
+variable_name_specifier
+ -> IDENTIFIER
+ -> IDENTIFIER, BASED, base_specifier
+
+variable_name_specifier_list
+ -> variable_name_specifier
+ -> variable_name_specifier_list, COMMA, variable_name_specifier
+/*
+ * Variable references may be either data references or function
+ * references.  Syntactically, they appear to be the same, each
+ * is followed by a parenthesized comma separated list of expressions.
+ *
+ * A function reference, of course, cannot have the trailing list of
+ * member specifiers - semantic checking will catch this.
+ */
+
+variable_reference
+ -> IDENTIFIER
+ -> IDENTIFIER, member_specifier_sequence
+ -> cast_type, subscript
+ -> IDENTIFIER, subscript_or_actual_parameters
+ -> IDENTIFIER, subscript_or_actual_parameters, member_specifier_sequence
+
+variable_reference_list
+ -> variable_reference
+ -> variable_reference_list, COMMA, variable_reference
+
+variable_type
+ -> basic_type
+ -> structure_type
+
+decimal number tail
+ ->
+ -> 'd'
+ -> '0-9', decimal number tail
+ -> '$', decimal number tail
+
+ decimal number
+ -> '0-9', decimal number tail
+
+binary number tail
+ -> 'b' + 'B'
+ -> '0-1', binary number tail
+ -> '$', binary number tail
+
+binary number
+ -> '0-1', binary number tail
+
+octal number tail
+ -> 'o' + 'O' + 'q' + 'Q'
+ -> '0-7', octal number tail
+ -> '$', octal number tail
+
+octal number
+ -> '0-7', octal number tail
+
+hex number tail
+ -> 'h' + 'H'
+ -> '0-9' + 'a-f' + 'A-F', hex number tail
+ -> '$', hex number tail
+
+hex number
+ -> '0-9', hex number tail
+
+floating point number tail
+ -> fraction part
+ -> fraction part, exponent
+ -> '0-9', floating point number tail
+
+floating point number
+ -> '0-9', floating point number tail
+
+fraction part
+ -> DOT
+ -> fraction part, '0-9'
+
+exponent
+ -> 'e' + '+', '0-9'...
+ -> '-', '0-9'...
+
+IDENTIFIER
+ -> 'a-z'
+ -> IDENTIFIER, 'a-z' + '0-9' + '$' + '_'
+
+STRING
+ -> '\'', [~(eof + '\'') | "''"]..., '\''
+
+{
+
+
+void
+yyerror(char * s)
+{
+  fprintf (stderr, "error at line %d: %s\n", lineno, s);
+}
+
+main()
+{
+  init_scope();
+  return yyparse();
+}
+
+}