0031851: Data Exchange, STEP - enable Unicode symbols in STEP export
[occt.git] / src / StepFile / step.yacc
1 /* 
2  Copyright (c) 1999-2014 OPEN CASCADE SAS
3
4  This file is part of Open CASCADE Technology software library.
5
6  This library is free software; you can redistribute it and/or modify it under
7  the terms of the GNU Lesser General Public License version 2.1 as published
8  by the Free Software Foundation, with special exception defined in the file
9  OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10  distribution for complete text of the license and disclaimer of any warranty.
11
12  Alternatively, this file may be used under the terms of Open CASCADE
13  commercial license or contractual agreement.
14 */ 
15
16 %code top {
17 // This file is part of Open CASCADE Technology software library.
18 // This file is generated, do not modify it directly; edit source file step.yacc instead.
19 }
20
21 %language "C++"
22 %require "3.2"
23
24 /* C++ parser interface */
25 %skeleton "lalr1.cc"
26
27 %parse-param  {step::scanner* scanner}
28
29 %locations
30
31 %token STEP HEADER ENDSEC DATA ENDSTEP SCOPE ENDSCOPE ENTITY TYPE INTEGER FLOAT IDENT TEXT NONDEF ENUM HEXA QUID
32 %start stepf
33
34 %code requires {
35 // This file is part of Open CASCADE Technology software library.
36 // This file is generated, do not modify it directly; edit source file step.yacc instead.
37
38 namespace step {
39   class scanner;
40 };
41
42 #ifdef _MSC_VER
43 // disable MSVC warning C4522: 'step::parser::stack_symbol_type': multiple assignment operators
44 #pragma warning(disable: 4522)
45 // disable MSVC warning C4512: 'step::parser::stack::slice' : assignment operator could not be generated
46 #pragma warning(disable: 4512)
47 #endif
48
49 }
50
51 %code {
52 #include "recfile.ph"           /* definitions des types d'arguments */
53 #include "recfile.pc"           /* la-dedans, tout y est */
54
55 #undef yylex
56 #define yylex scanner->lex
57
58 #define stepclearin yychar = -1
59 #define steperrok yyerrflag = 0
60
61 // disable MSVC warnings in bison code
62 #ifdef _MSC_VER
63 #pragma warning(disable:4065 4244 4131 4127 4702)
64 #define YYMALLOC malloc
65 #define YYFREE free
66 #endif
67 void StepFile_Interrupt (char* nomfic); /* rln 13.09.00 port on HP*/
68 }
69
70 %%
71 /*  N.B. : les commentaires sont filtres par LEX  */
72 /*  La fin vide (selon systeme emetteur) est filtree ici  */
73 finvide : ' '
74         | finvide ' ' ;
75 finstep : ENDSTEP
76         | ENDSTEP finvide ;
77 stepf1  : STEP HEADER headl ENDSEC endhead model ENDSEC finstep ;
78 stepf2  : STEP HEADER ENDSEC endhead model ENDSEC ENDSTEP ;
79 stepf3  : STEP HEADER ENDSEC endhead model error ;
80 stepf   : stepf1 | stepf2 | stepf3
81                 {  rec_finfile();  return(0);  /*  fini pour celui-la  */  }
82         ;
83 headl   : headent
84         | headl headent
85         ;
86 headent : enttype listarg ';'
87         | error                         /*  Erreur sur Entite : la sauter  */
88         ;
89 endhead : DATA
90         {  rec_finhead();  }
91         ;
92 unarg   : IDENT         {  rec_typarg(rec_argIdent);     rec_newarg();  }
93         | QUID          {  /* deja fait par lex*/        rec_newarg();  }
94         | listarg       /*  rec_newent lors du ')' */ {  rec_newarg();  }
95         | listype listarg  /*  liste typee  */        {  rec_newarg();  }
96         | error         {  rec_typarg(rec_argMisc);      rec_newarg();
97                            yyerrstatus_ = 1; yyclearin;  }
98 /*  Erreur sur Parametre : tacher de le noter sans jeter l'Entite  */
99         ;
100 listype : TYPE
101         {  rec_listype();  }
102         ;
103 deblist : '('
104         {  rec_deblist();  }
105         ;
106 finlist : ')'
107         {  if (modeprint > 0)
108                 {  printf("Record no : %d -- ",nbrec+1);  rec_print(currec);  }
109            rec_newent ();  yyerrstatus_ = 0; }
110         ;
111 listarg : deblist finlist               /* liste vide (peut y en avoir) */
112         | deblist arglist finlist       /* liste normale, non vide */
113         | deblist arglist ',' finlist   /* broken list with missing last parameter, see #31756 */
114         | deblist error
115         ;
116 arglist : unarg
117         | arglist ',' unarg
118         | arglist error
119         ;
120 model   : bloc
121         | model bloc
122         ;
123 bloc    : entlab '=' unent ';'
124         | entlab '=' debscop model finscop unent ';'
125         | entlab '=' debscop finscop unent ';'
126         | error                         /*  Erreur sur Entite : la sauter  */
127         ;
128 plex    : enttype listarg
129         | plex enttype listarg          /*    sert a ce qui suit :     */
130         ;
131 unent   : enttype listarg               /*    Entite de Type Simple    */
132         | '(' plex ')'                  /*    Entite de Type Complexe  */
133         ;
134 debscop : SCOPE
135         {  scope_debut();  }
136         ;
137 unid    : IDENT
138         {  rec_typarg(rec_argIdent);    rec_newarg();  }
139         ;
140 export  : unid
141         | export ',' unid
142         ;
143 debexp  : '/'
144         {  rec_deblist();  }
145         ;
146 finscop : ENDSCOPE
147         {  scope_fin();  }
148         | ENDSCOPE debexp export '/'
149         {  printf("***  Warning : Export List not yet processed\n");
150            rec_newent();  scope_fin() ; }
151                 /*  La liste Export est prise comme ARGUMENT du EndScope  */
152         ;
153 entlab  : ENTITY
154         {  rec_ident();  }
155         ;
156 enttype : TYPE
157         {  rec_type ();  }
158         ;
159 %%
160
161 void step::parser::error(const location_type& /*loc*/, const std::string& m)
162 {
163   char newmess[80];
164   sprintf(newmess, "At line %d : %s", scanner->lineno() + 1, m.c_str());
165   StepFile_Interrupt(newmess);
166 }