寄件者: Jack Chung [is87024@localhost.localdomain] 寄件日期: 2000年4月14日星期五 下午 12:49 收件者: wuuyang@localhost.localdomain %{ #include #include extern char* yytext; extern int yyleng; extern FILE* yyin; extern int currline, currcol; #define MAXLINE 2000 char* file_buffer[MAXLINE]; void er(char *); %} %token RW_ABS %token RW_AND %token RW_ARRAY %token RW_BEGIN %token RW_BODY %token RW_CASE %token RW_CONSTANT %token RW_DECLARE %token RW_ELSE %token RW_ELSIF %token RW_END %token RW_EXCEPTION %token RW_EXIT %token RW_FOR %token RW_FUNCTION %token RW_IF %token RW_IN %token RW_IS %token RW_LOOP %token RW_MOD %token RW_NOT %token RW_NULL %token RW_OF %token RW_OR %token RW_OTHERS %token RW_OUT %token RW_PACKAGE %token RW_PRAGMA %token RW_PRIVATE %token RW_PROCEDURE %token RW_RAISE %token RW_RANGE %token RW_RECORD %token RW_RETURN %token RW_REVERSE %token RW_SEPARATE %token RW_SUBTYPE %token RW_THEN %token RW_TYPE %token RW_USE %token RW_WHEN %token RW_WHILE %token IDENTIFIER %token INTLITERAL %token FLOATLITERAL %token STRLITERAL %token COLON %token COMMA %token ASSIGN %token OPEN_CLOSE %token ARROW %token L_PAREN %token R_PAREN %token DOT_DOT %token SEMI %token VERTICAL_BAR %token STAR_STAR %token EQUAL %token NOT_EQUAL %token LESS %token LESS_EQUAL %token GREATER %token GREATER_EQUAL %token PLUS %token MINUS %token AMPERSAND %token STAR %token SLASH %token DOT %token TICK %left LOGOP RW_AND RW_OR %nonassoc RELOP EQUAL NOT_EQUAL LESS LESS_EQUAL LESS_GREATER GREATER GREATER_EQUAL %left ADDOP PLUS MINUS AMPERSAND %nonassoc UNARYOP %left MULTOP STAR SLASH RW_MOD %nonassoc STAR_STAR %% Compilation : NonMtPcList ; NonMtPcList : PragmaList CompilationUnit | NonMtPcList PragmaList CompilationUnit ; PragmaList : | PragmaList Pragma ; Pragma : RW_PRAGMA Id SEMI | RW_PRAGMA error SEMI ; CompilationUnit : PackageDeclaration ; PackageDeclaration : RW_PACKAGE PackageSpecOrBody SEMI | RW_PACKAGE error SEMI ; PackageSpecOrBody : Id RW_IS SpecDeclList OptPrivatePart OptBody RW_END OptId | RW_BODY Id RW_IS BodyDeclList OptBeginStmtList OptExceptionPart RW_END OptId | RW_BODY Id RW_IS RW_SEPARATE ; SpecDeclList: | SpecDeclList SpecDeclaration ; OptPrivatePart : PrivatePart | ; BodyDeclList: | BodyDeclList BodyDeclaration ; OptBeginStmtList : | RW_BEGIN StmtList ; StmtList : | StmtList Statement ; OptExceptionPart: | ExceptionPart ; OptBody : | RW_BODY BodyDeclList OptBeginStmtList OptExceptionPart ; SpecDeclaration : PrivateTypeDeclaration | Declaration; PrivateTypeDeclaration : RW_TYPE Id RW_IS RW_PRIVATE SEMI | RW_TYPE error SEMI ; PrivatePart : RW_PRIVATE NonMtPrivateItemList ; NonMtPrivateItemList : PrivateItem | NonMtPrivateItemList PrivateItem ; PrivateItem : RW_SUBTYPE Id RW_IS SubtypeDefinition SEMI | RW_SUBTYPE error SEMI | RW_TYPE Id RW_IS TypeDefinition SEMI | RW_TYPE error SEMI ; BodyDeclaration : SubprogramBodyDecl | Declaration; Declaration : ObjectDeclaration | TypeDeclaration | SubtypeDeclaration | Pragma | SubprogramDeclaration | RW_USE NonMtNameList SEMI | RW_USE error SEMI | NonMtIdList COLON RW_EXCEPTION SEMI | error COLON RW_EXCEPTION SEMI ; ObjectDeclaration : NonMtIdList COLON OptConstant TypeOrSubtype OptInitialization SEMI; NonMtIdList : Id | NonMtIdList COMMA Id ; Id : IDENTIFIER ; OptConstant : | RW_CONSTANT ; TypeOrSubtype : ConstrainedArrayDef | SubtypeDefinition; OptInitialization : | ASSIGN Expression ; TypeDeclaration : RW_TYPE Id RW_IS TypeDefinition SEMI | RW_TYPE error RW_IS TypeDefinition SEMI | RW_TYPE Id RW_IS error SEMI ; TypeName : Id | Id DOT TypeName; TypeDefinition : RecordTypeDefinition | ArrayTypeDefinition | EnumerationTypeDef; RecordTypeDefinition : RW_RECORD NonMtComponentList RW_END RW_RECORD; NonMtComponentList : NonMtComponentDeclarationList | VariantPart | NonMtComponentDeclarationList VariantPart | RW_NULL SEMI; NonMtComponentDeclarationList : ComponentDeclaration | NonMtComponentDeclarationList ComponentDeclaration ; ComponentDeclaration : NonMtIdList COLON TypeOrSubtype OptInitialization SEMI; VariantPart : RW_CASE Id COLON TypeName RW_IS NonMtVariantList RW_END RW_CASE SEMI; NonMtVariantList : Variant | NonMtVariantList Variant ; Variant : RW_WHEN Vchoice ARROW NonMtComponentList; Vchoice : Expression; ArrayTypeDefinition : UnconstrainedArrayDef | ConstrainedArrayDef; UnconstrainedArrayDef : RW_ARRAY L_PAREN NonMtIndexSubtypeDefList R_PAREN RW_OF ElementType; NonMtIndexSubtypeDefList : IndexSubtypeDef | NonMtIndexSubtypeDefList COMMA IndexSubtypeDef ; IndexSubtypeDef : TypeName RW_RANGE OPEN_CLOSE; ConstrainedArrayDef : RW_ARRAY L_PAREN NonMtDiscreteRangeList R_PAREN RW_OF ElementType; NonMtDiscreteRangeList : DiscreteRange | NonMtDiscreteRangeList COMMA DiscreteRange; ElementType : TypeOrSubtype; EnumerationTypeDef : L_PAREN NonMtIdList R_PAREN; SubtypeDeclaration : RW_SUBTYPE Id RW_IS SubtypeDefinition SEMI; SubtypeDefinition : TypeName | RangeConstraint | TypeName RangeConstraint | TypeName IndexConstraint; RangeConstraint : RW_RANGE Range; Range : Expression DOT_DOT Expression; IndexConstraint : L_PAREN NonMtDiscreteRangeList R_PAREN; DiscreteRange : Id; DiscreteRange : Range; SubprogramDeclaration : SubprogramSpecification SEMI; SubprogramBodyDecl : SubprogramSpecification RW_IS BodyDeclList RW_BEGIN StmtList OptExceptionPart RW_END OptDesignator SEMI; SubprogramSpecification : RW_PROCEDURE Id OptFormalPart | RW_FUNCTION Designator OptFormalPart RW_RETURN SubtypeDefinition ; OptDesignator: | Designator; Designator : Id | OperatorSymbol; OperatorSymbol : STRLITERAL; FormalPart : L_PAREN NonMtParamDeclList R_PAREN; OptFormalPart : | FormalPart ; NonMtParamDeclList : ParameterDecl | NonMtParamDeclList SEMI ParameterDecl ; ParameterDecl : NonMtIdList COLON OptMode TypeName; OptMode : | Mode ; Mode : RW_IN RW_OUT | RW_IN | RW_OUT; ExceptionPart : RW_EXCEPTION ExceptionHandlerList; ExceptionHandlerList : | ExceptionHandlerList ExceptionHandler; ExceptionHandler : RW_WHEN ExceptionWhenTail; ExceptionWhenTail : RW_OTHERS ARROW StmtList | NonMtVbNameList ARROW StmtList; NonMtVbNameList : Name | NonMtVbNameList VERTICAL_BAR Name ; Statement : Pragma | NullStatement | AssignmentStatement | CallStatement | Block | LoopStatement | IfStatement | ExitStatement | ReturnStatement | CaseStatement | RaiseStatement; NullStatement : RW_NULL SEMI; AssignmentStatement : Name ASSIGN Expression SEMI; CallStatement : Name SEMI; Block : OptNameColon OptDeclPart RW_BEGIN StmtList OptExceptionPart RW_END OptId SEMI; OptNameColon : | Id COLON ; OptDeclPart : | DeclPart ; OptId : | Id ; DeclPart : RW_DECLARE BodyDeclList; ReturnStatement : RW_RETURN Expression SEMI | RW_RETURN SEMI RaiseStatement : RW_RAISE OptName SEMI; OptName : | Name ; IfStatement : RW_IF BExpr RW_THEN StmtList ElsifList OptElsePart RW_END RW_IF SEMI; ElsifList : | ElsifList RW_ELSIF BExpr RW_THEN StmtList ; OptElsePart : | ElsePart ; ElsePart : RW_ELSE StmtList; LoopStatement : OptNameColon OptIterationClause BasicLoop OptId SEMI; OptIterationClause : | IterationClause ; BasicLoop : RW_LOOP StmtList RW_END RW_LOOP; IterationClause : RW_WHILE BExpr | RW_FOR Id RW_IN OptReverse DiscreteRange ; OptReverse : | RW_REVERSE ; ExitStatement : RW_EXIT Name RW_WHEN BExpr SEMI | RW_EXIT SEMI | RW_EXIT RW_WHEN BExpr SEMI | RW_EXIT Name SEMI; CaseStatement : RW_CASE Expression RW_IS WhenList OptOthers RW_END RW_CASE SEMI; WhenList : | WhenList When; When: RW_WHEN NonMtChoiceList ARROW StmtList; OptOthers : | RW_WHEN RW_OTHERS ARROW StmtList ; NonMtChoiceList : Choice | NonMtChoiceList VERTICAL_BAR Choice ; Choice : Expression | Expression DOT_DOT Expression; BExpr : Expression; Expression : Expression LogicalOp Expression %prec LOGOP | Expression RW_AND RW_THEN Expression %prec LOGOP | Expression RW_OR RW_ELSE Expression %prec LOGOP | Expression RelationalOp Expression %prec RELOP | Expression AddingOp Expression %prec ADDOP | UnaryAddingOp Expression %prec UNARYOP | Expression MultiplyingOp Expression %prec MULTOP | Expression STAR_STAR Expression | RW_NOT Primary | RW_ABS Primary | Primary ; Primary : Literal ; | Name ; | L_PAREN Expression R_PAREN ; Literal : INTLITERAL; | FLOATLITERAL; | STRLITERAL; LogicalOp : RW_AND; | RW_OR; RelationalOp : EQUAL ; | NOT_EQUAL ; | LESS; | LESS_EQUAL; | GREATER ; | GREATER_EQUAL ; AddingOp : PLUS ; | MINUS ; | AMPERSAND ; UnaryAddingOp : PLUS ; | MINUS ; MultiplyingOp : STAR ; | SLASH ; | RW_MOD ; Name : Id NonMtNameSuffixList ; NonMtNameSuffixList : | DOT Id NonMtNameSuffixList | DOT OperatorSymbol NonMtNameSuffixList | L_PAREN NonMtExpList R_PAREN NonMtNameSuffixList | TICK Id NonMtNameSuffixList ; NonMtExpList : Expression ; | NonMtExpList COMMA Expression ; NonMtNameList : Name ; | NonMtNameList COMMA Name ; %% int yyerror(char *s) { printf("At (%d, %d), %s:\n", currline, currcol, s); printf("%s", file_buffer[currline]); printf("%*s", currcol - yyleng + 1, "^"); return 0; }