Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Accent/generate/   (Accent Parser Generator Version 0.9©)  Datei vom 19.6.2004 mit Größe 16 kB image not shown  

Quelle  bnf.g   Sprache: unbekannt

 
-- ACCENT 
-- 
-- A Compiler Compiler for the Entire Class of Context-Free Languages
-- 
-- Copyright (C) 1999  Friedrich Wilhelm Schroeer
-- 
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
-- 
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
-- 
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.


'module' bnf
'use'
   encode
   lexinfo
   verbose
   actions
   flatten

'export'
   IDENT
   RULEKEY
   id_to_string
   SUBPHRASEKEY
   ALTERNATIVEKEY
   ALTERNATIVE
   ALTERNATIVELIST
   RULELIST

   RULE

   RHSLIST
   RHS
   MEMBERLIST
   MEMBER

   FORMPARAMLIST
   FORMPARAM
   MODE

   ACTPARAMLIST
   ACTPARAM

   NONTERMKEY

   RULES
   NONTERMS
   NontermList
   HasMeaning
   OBJECT

   SUBPHRASEKIND

   MEMBERANNOTATION
   RULEANNOTATION

   ACTIONBLOCK

   NumberOfRules
   NumberOfNonterms

   Error
   ErrorI

   PreludeBlock

   -- for "flatten.g"
   FreshAlternativeNumber

   -- for "encode.g"
   get_max_char

   GentleFlag
   Bool

'root'
   init

   GentleOption
   PreludeOption
   token_decl_part
   rulelist(-> L)

   Process(L)

'action' Process(RULELIST)
'rule' Process(L)
   (|
      where(L -> list(xxrule(UserRoot,_,_,_,_,Pos),_))
   ||
      where(L -> list(rule(UserRoot,_,_,Pos),_))
   |)
   StartRule (UserRoot, Pos -> SR)
   HasMeaning(UserRoot -> nontermobj(_,_,Formals))
   [|
      where(Formals -> list)
      ErrorI("Startsymbol ('", UserRoot, "') can not have parameters", Pos)
   |]

   where(RULELIST'list(SR,L) -> L2)

   grammarcode_rulelist(L2)
   
   lexinfo -- (must precede ENCODE)

   OpenOutput("yygrammar.c")
   put_actions
   ENCODE

   /* put_grammar */
   CloseOutput
   

'type' ACTIONBLOCK
   action(STRING, POS)
   none

'var' PreludeBlock: ACTIONBLOCK

'nonterm' PreludeOption
   'rule' PreludeOption
       "%prelude"
       ActionBlock(-> Block)
       PreludeBlock <- Block
   'rule' PreludeOption
       PreludeBlock <- none

'action' StartRule(IDENT, POS -> RULE)
   'rule' StartRule(UserRoot, Pos -> StartRule)


      string_to_id("YYSTART" -> Id)

      where(MEMBERLIST'list(call(UserRoot, nil(Pos), undef, Pos), list(token(0), nil))
  -> Members)

      Key :: RULEKEY
      FreshRuleNumber(-> N)
      Key'RuleNumber <- N
      Key'Members <- Members
      define_nonterm(Id, nil, Pos)

      where(xxrule(Id, Members, Key, none, prio(0), Pos) -> StartRule)

'action' string_to_id(STRING -> IDENT)

--------------------------------------------------------------------------------

--
-- Abstract Syntax
-- 

'type' RULELIST
   list(RULE, RULELIST)
   nil

'type' RULE
   xxrule(IDENT, MEMBERLIST, RULEKEY, ACTIONBLOCK, RULEANNOTATION, POS)
   rule(IDENT, RHSLIST, ACTIONBLOCK, POS)

'type' RHSLIST
   list(RHS, RHSLIST)
   nil

'type' RHS
   rhs(MEMBERLIST, RULEKEY, RULEANNOTATION, POS)

'type' RULEANNOTATION
   prio(INT)
   undef

'type' MEMBERLIST
   list(MEMBER, MEMBERLIST)
   nil

'type' MEMBER
   call(IDENT, ACTPARAMLIST, MEMBERANNOTATION, POS)
   token(INT)
   subphrase
      (SUBPHRASEKIND, ALTERNATIVELIST, SUBPHRASEKEY, MEMBERANNOTATION, POS)
   sem(ACTIONBLOCK)

'type' MEMBERANNOTATION
   short
   long
   undef
   user(INT)

'type' SUBPHRASEKIND
   option
   loop
   posclos
   alternatives

'type' ALTERNATIVELIST
   list(ALTERNATIVE, ALTERNATIVELIST)
   nil(RULEANNOTATION, POS)

'type' ALTERNATIVE
   alternative(MEMBERLIST, ALTERNATIVEKEY, RULEANNOTATION, POS)

'type' FORMPARAMLIST
   list(FORMPARAM, FORMPARAMLIST)
   nil

'type' FORMPARAM
   param(MODE, Type: IDENT, Name: IDENT, POS)

'type' MODE
   xxin
   out
   none

'type' ACTPARAMLIST
   list(ACTPARAM, ACTPARAMLIST, POS)
   nil(POS)

'type' ACTPARAM
   id(IDENT, POS)

--------------------------------------------------------------------------------

'table' RULEKEY
   (Members: MEMBERLIST, RuleNumber: INT, RuleHandle: INT)
'table' ALTERNATIVEKEY
   (Members: MEMBERLIST, AlternativeNumber: INT,
   ClauseKey: CLAUSEKEY,
   RuleHandle: INT/*, PosOfNextRule: INT*/)
'table' SUBPHRASEKEY (SubphraseNumber: INT)
'table' NONTERMKEY(Rules: RULES, PosOfNonterm: INT)

'type' RULES
   rules(ButLast: RULES, Last: RULE)
   nil

--------------------------------------------------------------------------------

--
-- Grammar
--
'var' UniqueRuleNumber: INT

'action' FreshRuleNumber (-> INT)
'rule' FreshRuleNumber(-> N+1)
   UniqueRuleNumber -> N
   UniqueRuleNumber <- N+1

'var' UniqueAlternativeNumber: INT

'action' FreshAlternativeNumber (-> INT)
'rule' FreshAlternativeNumber(-> N+1)
   UniqueAlternativeNumber -> N
   UniqueAlternativeNumber <- N+1

'var' UniqueSubphraseNumber: INT

'action' FreshSubphraseNumber (-> INT)
'rule' FreshSubphraseNumber(-> N+1)
   UniqueSubphraseNumber -> N
   UniqueSubphraseNumber <- N+1

'nonterm' init
'rule' init
   init_tokenlist
   init_lexinfo
   init_verbose
   NontermList <- nil
   INIT_ENCODE
   UniqueNontermNumber <- 0
   UniqueRuleNumber <- 0
   UniqueSubphraseNumber <- 0
   UniqueAlternativeNumber <- 0

'nonterm' token_decl_part
   'rule' token_decl_part
      "%token"
      token_decl_list
      ";"
   'rule' token_decl_part

'nonterm' token_decl_list
   'rule' token_decl_list:
      token_decl ","
      token_decl_list
   'rule' token_decl_list
      token_decl

'nonterm' token_decl
   'rule' token_decl:
      Ident(-> I) @(-> P)
      FreshTokenNumber(-> N)
      TableUpb2(N)
      string_to_id ("YYSTYPE" -> Yystype)
      string_to_id ("Dummy" -> Dummy)
      where(FORMPARAMLIST'list (param(out, Yystype, Dummy, P), nil) -> L)
      define_token(I, L, N, P)
      enter_token(I, N)
      TokenCount -> K
      [|
  gt(N, K)
  TokenCount <- N
      |]

'action' FreshTokenNumber(-> INT)
   'rule' FreshTokenNumber(-> N)
      NextTokenNumber -> N
      NextTokenNumber <- N+1


'nonterm' rulelist(-> RULELIST)
   'rule' rulelist(-> list(H,T)): rule(-> H) rulelist(-> T)
   'rule' rulelist(-> list(H,nil)): rule(-> H)

'nonterm' rule(-> RULE)

   'rule' rule (-> rule(I, RhsList, Prelude, Pos))
      Ident(-> I) FormalParameters(-> L)
      ":"
      @(-> Pos)
      RulePrelude(-> Prelude)
      rhslist(-> RhsList)
      ";"
      define_nonterm(I, L, Pos)

'nonterm' rhslist(-> RHSLIST)
   'rule' rhslist(-> list(Hd, Tl))
      rhs(-> Hd) "|" rhslist(-> Tl)
   'rule' rhslist(-> list(Hd, nil))
      rhs(-> Hd)

'nonterm' rhs(-> RHS)
   'rule' rhs(-> rhs(R, Key, Annotation, Pos))
      @(-> Pos)
      memberlist(-> R)
      RuleAnnotation(-> Annotation)
      Key :: RULEKEY
      FreshRuleNumber(-> N)
      Key'RuleNumber <- N
      Key'Members <- R

'nonterm' RulePrelude(-> ACTIONBLOCK)
   'rule' RulePrelude(-> Block)
      "%prelude"
      ActionBlock(-> Block)
   'rule' RulePrelude(-> none)

'nonterm' RuleAnnotation(-> RULEANNOTATION)
   'rule' RuleAnnotation(-> prio(N))
      "%prio" Number(-> N)
   'rule' RuleAnnotation(-> prio(-N))
      "%label" Number(-> N)
   'rule' RuleAnnotation(-> undef)

'nonterm' memberlist(-> MEMBERLIST)
   'rule' memberlist(-> list(H, T))
      member(-> H) memberlist(-> T)
   'rule' memberlist(-> nil)

'nonterm' member(-> MEMBER)
   'rule' member(-> call(I, L, Annotation, Pos))
      MemberAnnotation(-> Annotation)
      Ident(-> I) @(-> Pos)
      ActualParameters(-> L)
   'rule' member(-> call(I, nil(Pos), undef, Pos))
      "%immediate"
      @(-> Pos)
      string_to_id("YYIMMEDIATE" -> I)

   'rule' member(-> token(I))
      Char(-> I)
   /*
   'rule' member(-> token(I))
      String(-> S)
      StringToTokenNumber(S -> I)
      */
   'rule' member(-> subphrase(option, L, Key, Annotation, Pos))
      MemberAnnotation(-> Annotation)
      "(" @(-> Pos) alternativelist(-> L) ")?"
      Key :: SUBPHRASEKEY
      FreshSubphraseNumber(-> N)
      Key'SubphraseNumber <- N
   'rule' member(-> subphrase(loop, L, Key, Annotation, Pos))
      MemberAnnotation(-> Annotation)
      "(" @(-> Pos) alternativelist(-> L) ")*"
      Key :: SUBPHRASEKEY
      FreshSubphraseNumber(-> N)
      Key'SubphraseNumber <- N
   'rule' member(-> subphrase(alternatives, L, Key, Annotation, Pos))
      MemberAnnotation(-> Annotation)
      "(" @(-> Pos) alternativelist(-> L) ")"
      Key :: SUBPHRASEKEY
      FreshSubphraseNumber(-> N)
      Key'SubphraseNumber <- N
   'rule' member(-> sem(Block))
      ActionBlock(-> Block)

   'rule' member(-> Group2)

      MemberAnnotation(-> Annotation)
      "(" @(-> Pos) alternativelist(-> Alternativelist) ")+"

      -- (0) Alternativelist: U|V

      -- (1) Loop: ( Alternativelist )*  =  ( U|V )*
      Step1(Alternativelist, Pos -> Loop)

      -- (2) Group1: ( Alternativelist )  =  ( U|V )
      Step2(Alternativelist, Pos -> Group1)

      -- (3) Memberlist: Group1 Loop  =  ( U|V ) ( U|V )*
      where(MEMBERLIST'list(Group1,list(Loop,nil)) -> Memberlist)

      -- (4) Group2: ( Memberlist )  =  ( ( U|V ) ( U|V )* )
      Step4(Memberlist, Pos, Annotation -> Group2)

'action' Step1(ALTERNATIVELIST, POS -> MEMBER)
'rule' Step1(Alternativelist, Pos -> Loop)
   Key_Loop :: SUBPHRASEKEY
   FreshSubphraseNumber(-> N_Loop)
   Key_Loop'SubphraseNumber <- N_Loop

   where(MEMBER'subphrase(loop, Alternativelist, Key_Loop, undef, Pos) -> Loop)

'action' Step2(ALTERNATIVELIST, POS -> MEMBER)
'rule' Step2(Alternativelist, Pos -> Group1)
   Key_Group1 :: SUBPHRASEKEY
   FreshSubphraseNumber(-> N_Group1)
   Key_Group1'SubphraseNumber <- N_Group1

   where(
      MEMBER'subphrase(
         alternatives,
         Alternativelist,
         Key_Group1, undef, Pos
      )
      ->
      Group1
   )

'action' Step4 (MEMBERLIST, POS, MEMBERANNOTATION -> MEMBER)
'rule' Step4 (Memberlist, Pos, Annotation -> Group2)

   Key_X :: ALTERNATIVEKEY
   FreshAlternativeNumber(-> N_X)
   Key_X'AlternativeNumber <- N_X
   Key_X'Members <- Memberlist

   where(alternative(Memberlist, Key_X, undef, Pos) -> Alternative)

   Key_Group2 :: SUBPHRASEKEY
   FreshSubphraseNumber(-> N_Group2)
   Key_Group2'SubphraseNumber <- N_Group2

   where(
      MEMBER'subphrase(
         alternatives,
         list(
            Alternative,
            nil(undef, Pos)
         ),
         Key_Group2, Annotation, Pos
      )
      ->
      Group2
   )

'nonterm' MemberAnnotation(-> MEMBERANNOTATION)
   'rule' MemberAnnotation(-> short)
      "%short"
   'rule' MemberAnnotation(-> long)
      "%long"
   'rule' MemberAnnotation(-> user(N))
      "%user" Number(-> N)
   'rule' MemberAnnotation(-> undef)

'nonterm' FormalParameters(-> FORMPARAMLIST)
   'rule' FormalParameters(-> L):
      "<" FormalParameterList(-> L) ">"
   'rule' FormalParameters(-> L):
      "<" FormalOutParameters(-> L) ">"
   'rule' FormalParameters(-> L):
      "<" FormalInParameters(-> IL) ">"
      convert_to_in_parameters(IL -> L)
   'rule' FormalParameters(-> L):
      "<" FormalInParameters(-> IL0)
          FormalOutParameters(-> OL)
      ">"
      convert_to_in_parameters(IL0 -> IL)
      append_parameter_lists(IL, OL -> L)
   'rule' FormalParameters(-> nil):

'nonterm' FormalInParameters(-> FORMPARAMLIST)
   'rule' FormalInParameters(-> L):
      "%in" FormalParameterList(-> L)

'nonterm' FormalOutParameters(-> FORMPARAMLIST)
   'rule' FormalOutParameters(-> L):
      "%out" FormalParameterList(-> L)

'nonterm' FormalParameterList(-> FORMPARAMLIST)
   'rule' FormalParameterList(-> list(H, T))
      FormalParameter(-> H) "," FormalParameterList(-> T)
   'rule' FormalParameterList(-> list(H, nil))
      FormalParameter(-> H)

'nonterm' FormalParameter(-> FORMPARAM)
   'rule' FormalParameter(-> param(out, Type, Name, Pos))
      Ident(-> Type)
      Ident(-> Name)
      @(-> Pos)
   'rule' FormalParameter(-> param(out, Type, Name, Pos))
      Ident(-> Name)
      @(-> Pos)
      string_to_id("YYSTYPE" -> Type)

'nonterm' ActualParameters(-> ACTPARAMLIST)
   'rule' ActualParameters(-> L):
      "<" ActualParameterList(-> L) ">"
   'rule' ActualParameters(-> nil(Pos)):
      @(-> Pos)

'nonterm' ActualParameterList(-> ACTPARAMLIST)
   'rule' ActualParameterList(-> list(H, T, Pos))
      ActualParameter(-> H) @(-> Pos) "," ActualParameterList(-> T)
   'rule' ActualParameterList(-> list(H, nil(Pos), Pos))
      ActualParameter(-> H) @(-> Pos)

'nonterm' ActualParameter(-> ACTPARAM)
   'rule' ActualParameter(-> id(Id, Pos))
      Ident(-> Id) @(-> Pos)

'nonterm' alternativelist(-> ALTERNATIVELIST)
   'rule' alternativelist(-> list(H, T))
      alternative(-> H) "|" alternativelist(-> T)
   'rule' alternativelist(-> list(H, nil(undef, Pos)))
      alternative(-> H)
      @(-> Pos)
      -- xx rule annotaion for nil

'nonterm' alternative(-> ALTERNATIVE)
   'rule' alternative(-> alternative(L, Key, Annotation, Pos))
      @(-> Pos)
      memberlist(-> L)
      RuleAnnotation(-> Annotation)
      Key :: ALTERNATIVEKEY
      FreshAlternativeNumber(-> N)
      Key'AlternativeNumber <- N
      Key'Members <- L

'nonterm' ActionBlock(-> ACTIONBLOCK)
   'rule' ActionBlock(-> action(Str, Pos))
      @(-> Pos)
      CodeBlock(-> Str)

'token' Ident(-> IDENT)
--'token' String(-> STRING)
'token' Char(-> INT)
'token' Number(-> INT)
'token' CodeBlock(-> STRING)

-------------------------------------------------------------------------------

'var' NontermList: NONTERMS
'type' NONTERMS
   nonterms(NONTERMS, NONTERMKEY)
   nil

'type' OBJECT
   tokenobj(INT, FORMPARAMLIST)
   nontermobj(INT, NONTERMKEY, FORMPARAMLIST)

'var' UniqueNontermNumber: INT

'action' define_token (IDENT, FORMPARAMLIST, INT, POS)
   'rule' define_token (Id, Params, N, Pos)
      (|
  HasMeaning (Id -> Obj)
  ErrorI("'", Id, "' already defined", Pos)
      ||
  DefMeaning (Id, tokenobj(N, Params))
      |)

'action' define_nonterm (IDENT, FORMPARAMLIST, POS)
   'rule' define_nonterm(Id, FormalParams, Pos)
      (|
  HasMeaning (Id -> Obj)
  (|
      where(Obj -> tokenobj)
      ErrorI("nonterminal '", Id, "' already defined as token", Pos)
  ||
      ErrorI("nonterminal '", Id, "' defined by more than one rule", Pos)
  |)
      ||
  UniqueNontermNumber -> N
  UniqueNontermNumber <- N+1
  NKey :: NONTERMKEY
  NKey'Rules <- nil
  DefMeaning (Id, nontermobj(N+1, NKey, FormalParams))
  NontermList -> L
  NontermList <- nonterms(L, NKey)
      |)

--
-- Idents
--

'type' IDENT
'condition' HasMeaning(IDENT -> OBJECT)
'action' DefMeaning(IDENT, OBJECT)
'action' id_to_string(IDENT -> STRING)

--------------------------------------------------------------------------------

--
-- Token List
--

'var' TokenList: TOKENLIST
'var' TokenCount: INT
'var' NextTokenNumber: INT

'type' TOKENLIST
   list (TOKENENTRY, TOKENLIST)
   nil

'type' TOKENENTRY
   token(STRING, INT)

'action' init_tokenlist
'rule' init_tokenlist
   TokenList <- nil
   TokenCount <- 0
   get_max_char(-> MAXCHAR)
   NextTokenNumber <- MAXCHAR+1

'action' get_max_char(-> INT)

'action' TokenNumberToString(INT -> STRING)
'rule' TokenNumberToString(N -> S)
   TokenList -> L
   lookup_tokenstring(L, N -> S)

'action' lookup_tokenstring(TOKENLIST, INT -> STRING)
'rule' lookup_tokenstring(list(token(S0, N0), Tl), N -> S)
   (|
      eq(N0, N)
      where(S0 -> S)
   ||
      lookup_tokenstring(Tl, N -> S)
   |)

--------------------------------------------------------------------------------

'action' NumberOfRules(-> INT)
'rule' NumberOfRules(-> N)
   UniqueRuleNumber -> N

'action' NumberOfNonterms(-> INT)
'rule' NumberOfNonterms(-> N)
   UniqueNontermNumber -> N

--------------------------------------------------------------------------------

'action' convert_to_in_parameters(FORMPARAMLIST -> FORMPARAMLIST)
   'rule' convert_to_in_parameters(list(param(_,T,N,P), T1) 
   -> list(param(xxin,T,N,P), T2)):
      convert_to_in_parameters(T1 -> T2)
   'rule' convert_to_in_parameters(nil -> nil) 

'action' append_parameter_lists
   (FORMPARAMLIST, FORMPARAMLIST -> FORMPARAMLIST)
'rule' append_parameter_lists(list(H, T), L -> list(H, TL)):
   append_parameter_lists(T, L -> TL)
'rule' append_parameter_lists(nil, L -> L)

'action' Error (STRING, POS)
'action' ErrorI (STRING, IDENT, STRING, POS)

--------------------------------------------------------------------------------

'type' Bool
   yes
   no

'nonterm' GentleOption
'rule' GentleOption
   "%gentle"
   GentleFlag <- yes
'rule' GentleOption
   GentleFlag <- no

'var' GentleFlag: Bool

--------------------------------------------------------------------------------

[ Dauer der Verarbeitung: 0.25 Sekunden  (vorverarbeitet)  ]