Branch data Line data Source code
1 : : /* -*-c++-*- */
2 : :
3 : : %{
4 : : /*
5 : : * parse_dataset.y - parser for the Qucs dataset
6 : : *
7 : : * Copyright (C) 2003, 2004, 2006 Stefan Jahn <stefan@lkcc.org>
8 : : *
9 : : * This is free software; you can redistribute it and/or modify
10 : : * it under the terms of the GNU General Public License as published by
11 : : * the Free Software Foundation; either version 2, or (at your option)
12 : : * any later version.
13 : : *
14 : : * This software is distributed in the hope that it will be useful,
15 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : : * GNU General Public License for more details.
18 : : *
19 : : * You should have received a copy of the GNU General Public License
20 : : * along with this package; see the file COPYING. If not, write to
21 : : * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
22 : : * Boston, MA 02110-1301, USA.
23 : : *
24 : : * $Id$
25 : : *
26 : : */
27 : :
28 : : #if HAVE_CONFIG_H
29 : : # include <config.h>
30 : : #endif
31 : :
32 : : #include <stdio.h>
33 : : #include <stdlib.h>
34 : : #include <string.h>
35 : :
36 : : #define YYERROR_VERBOSE 42
37 : : #define YYDEBUG 1
38 : : #define YYMAXDEPTH 10000000
39 : :
40 : : #include "logging.h"
41 : : #include "complex.h"
42 : : #include "object.h"
43 : : #include "vector.h"
44 : : #include "dataset.h"
45 : : #include "strlist.h"
46 : : #include "check_dataset.h"
47 : :
48 : : using namespace qucs;
49 : :
50 : : %}
51 : :
52 : : %name-prefix="dataset_"
53 : :
54 : : %token InvalidCharacter
55 : : %token Identifier
56 : : %token REAL
57 : : %token IMAG
58 : : %token COMPLEX
59 : : %token Integer
60 : : %token Eol
61 : : %token IndepBegin
62 : : %token DepBegin
63 : : %token IndepEnd
64 : : %token DepEnd
65 : : %token Version
66 : :
67 : : %union {
68 : : char * ident;
69 : : double f;
70 : : struct {
71 : : double r;
72 : : double i;
73 : : } c;
74 : : long n;
75 : : qucs::vector * v;
76 : : qucs::dataset * data;
77 : : qucs::strlist * list;
78 : : }
79 : :
80 : : %type <list> IdentifierList
81 : : %type <ident> Identifier
82 : : %type <f> REAL IMAG
83 : : %type <c> COMPLEX
84 : : %type <n> Integer
85 : : %type <v> FloatList
86 : : %type <data> VersionLine VariableList Variable
87 : :
88 : : %%
89 : :
90 : : Input:
91 : : VersionLine VariableList { /* describes a valid dataset */ }
92 : : ;
93 : :
94 : : VersionLine:
95 : : Version Eol { /* version line */
96 [ # # ][ # # ]: 0 : $$ = dataset_result = new dataset ();
97 : : }
98 : : ;
99 : :
100 : : VariableList: /* nothing */ { }
101 : : | Variable VariableList { /* dependent and independent variable vectors */ }
102 : : | Eol VariableList { /* skip to next line */ }
103 : : ;
104 : :
105 : : Variable:
106 : : '<' DepBegin Identifier IdentifierList '>' FloatList '<' DepEnd '>' {
107 : : /* dependent variable vector */
108 [ # # ]: 0 : dataset_vector->setName ($3);
109 [ # # ]: 0 : dataset_vector->reverse ();
110 [ # # ]: 0 : dataset_vector->setDependencies (dataset_idents);
111 [ # # ]: 0 : dataset_result->appendVariable (dataset_vector);
112 : 0 : dataset_vector = NULL;
113 : 0 : dataset_idents = NULL;
114 : 0 : free ($3);
115 : : }
116 : : | '<' IndepBegin Identifier Integer '>' FloatList '<' IndepEnd '>' {
117 : : /* independent variable vector */
118 : 0 : dataset_vector->setRequested ($4);
119 [ # # ]: 0 : dataset_vector->setName ($3);
120 [ # # ]: 0 : dataset_vector->reverse ();
121 [ # # ]: 0 : dataset_result->appendDependency (dataset_vector);
122 : 0 : dataset_vector = NULL;
123 : 0 : free ($3);
124 : : }
125 : : ;
126 : :
127 [ # # ][ # # ]: 0 : FloatList: /* nothing */ { $$ = dataset_vector = new vector (); }
128 : : | REAL FloatList {
129 [ # # ]: 0 : dataset_vector->add ($1);
130 : : }
131 : : | COMPLEX FloatList {
132 [ # # ]: 0 : dataset_vector->add (nr_complex_t ($1.r, $1.i));
133 : : }
134 : : | IMAG FloatList {
135 [ # # ]: 0 : dataset_vector->add (nr_complex_t (0.0, $1));
136 : : }
137 : : | Eol FloatList { /* skip to next line */ }
138 : : ;
139 : :
140 [ # # ][ # # ]: 0 : IdentifierList: /* nothing */ { $$ = dataset_idents = new strlist (); }
141 : : | Identifier IdentifierList {
142 [ # # ]: 0 : dataset_idents->add ($1);
143 : 0 : free ($1);
144 : : }
145 : : ;
146 : :
147 : : %%
148 : :
149 : 0 : int dataset_error (const char * error) {
150 : 0 : logprint (LOG_ERROR, "line %d: %s\n", dataset_lineno, error);
151 : 0 : return 0;
152 : : }
|