Related articles |
---|
Data File Parsing nkenig@linarite.telesciences.com (1993-06-07) |
Newsgroups: | comp.compilers,comp.sw.components,comp.sources.wanted |
From: | nkenig@linarite.telesciences.com (Neil S Kenig) |
Keywords: | question, lex, comment |
Organization: | TeleSciences CO Systems, Inc. |
Date: | Mon, 7 Jun 1993 20:27:52 GMT |
I need to read parameters from an Ascii text file into a C program in a
Unix environment. I am looking for a technique that's easy to get working
quickly. I'm not a real lex/yacc user. If that's the way to go, would
somebody please get me started on a grammar definition or modifications
that I should make to the file syntax in order to make the file easier to
parse? Any other suggestions about possible solutions are most welcome.
Ideally, I'd like to make calls like:
float *optimization;
num_values = get_values ("Performance", "optimization", &optimization);
Which would return 1, allocate a float and set *optimization to 1 (TRUE).
float *module_ids;
num_values = get_values ("Modules", "module_id", &module_ids);
Which would return 8 and allocate an array to hold the 8 module ids.
The format of this parameter file is
1) lines beginning with a pound sign (#) are considered comments
and ignored. Leading blanks, if present, are ignored. Trailing
comments may NOT be appended to section or parameter lines.
2) blank lines are ignored
3) Files are divided into sections. Sections contain logical aggregations
of parameters. Section names are indicated by lines of the format
- section
where "section" is the name of the section. Blanks before or after
the "-" are ignored. Any words beyond the first word of the section
name are ignored. All parameters specified after a section heading are
considered to be part of that section until another section name
or EOF is encountered. At least one section name must always be
present. Any parameters appearing before the first section name
will be considered a syntax error.
5) Within each section, parameters are specified in groups. Each group
begins with a parameter definition line followed by parameter value
lines. The parameter definition line is of the format:
name:type,name:type,name:type
where each name is a valid C language variable name and type is one of:
'n' or 'N' for numeric data
's' or 'S' for string (character) data
'b' or 'B' for Boolean data (which may only take on the values
't', 'true', 'y', 'yes', '1', or 'on'
'f', 'false', 'n', 'no', '0', or 'off'
in any mixed case.
Parameter value lines are specified by:
value:value:value
Numbers may be positive or negative and may be floating point or integer.
String data must be enclosed in double quotes (").
If values are ommited, e.g. by specifying consecutive colons (:), then
numeric values will default to 0, string values will default to the
NULL string and boolean data will default to false.
Multiple parameter value lines may follow a single parameter definition
line thus designating an array of parameter values.
An example parameter file is:
#
# Parameters for system configuration
#
- Performance Parameters
optimization:b
on
encoding:b
True
backup_interval:n
5
number_of_buckets:n
22
- Modules
module_id:n,hostname:s,local_id:n,module_name:s,command_line:s
#Host LSM1
10:"LSM1": 1:"LSM": "/usr/bin/lsm -path /usr/lsm"
15:"LSM1": 2:"CLI": "/usr/bin/cli -path /usr/cli"
20:"LSM1": 4:"Cerberus":"/usr/bin/cerberus -path /usr/cerberus"
25:"LSM1": 8:"Dragon": "/usr/bin/dragon -path /usr/dragon"
# Host LSM2
40:"LSM2": 1:"LSM": "/usr/bin/lsm -path /usr/lsm"
45:"LSM2": 2:"CLI": "/usr/bin/cli -path /usr/cli"
50:"LSM2": 4:"Cerberus":"/usr/bin/cerberus -path /usr/cerberus"
55:"LSM2": 8:"Dragon": "/usr/bin/dragon -path /usr/dragon"
#
# Relationships between the various processors in the system
#
- Primary Systems
name:s
"LSM1"
"LSM2"
- Secondary Systems
name:s
"LSM3"
- Master Systems
name:s
"LSM1"
"LSM3"
--
|
Neil Kenig | TeleSciences CO Systems
| 351 New Albany Road
nkenig@telesciences.com | Moorestown, NJ 08057
|
| (609)866-1000 ext. 228
[This should be straightforward to get working using lex and some C code.
-John]
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.