Commit 672dcb89 authored by Anders Blomdell's avatar Anders Blomdell
Browse files

More parsing

parent 3673bb52
......@@ -18,15 +18,17 @@ static struct moberg_driver_config parse_config(
printf("PARSE_CONFIG %s\n", __FILE__);
printf("LBRACE %d", acceptsym(c, tok_LBRACE, &t));
for (;;) {
if (acceptsym(c, tok_IDENT, &t) ||
acceptsym(c, tok_CONFIG, &t)) {
if (acceptsym(c, tok_RBRACE, NULL)) {
break;
} else if (acceptsym(c, tok_IDENT, &t) ||
acceptsym(c, tok_CONFIG, &t)) {
const char *v = t.u.ident.value;
int l = t.u.ident.length;
if (strncmp("device", v, l) == 0) {
printf("DEVICE\n");
} else if (strncmp("modprobe", v, l) == 0) {
printf("MODPROBE\n");
} else if (strncmp("comedi", v, l) == 0) {
} else if (strncmp("config", v, l) == 0) {
printf("CONFIG\n");
}
acceptsym(c, tok_EQUAL, NULL);
......@@ -36,25 +38,31 @@ static struct moberg_driver_config parse_config(
printf("%d\n", t.kind);
if (t.kind == tok_SEMICOLON) { break; }
}
} else if (acceptsym(c, tok_RBRACE, NULL)) {
break;
} else {
goto err;
break;
}
}
return result;
err:
exit(1);
printf("PARSE_CONFIG DONE%s\n", __FILE__);
return result;
}
static struct moberg_driver_map parse_map(
struct moberg_config_parser_context *context,
struct moberg_config_parser_context *c,
enum moberg_config_parser_token_kind kind)
{
struct moberg_driver_map result;
token_t t;
printf("PARSE_MAP %s\n", __FILE__);
if (acceptsym(c, tok_IDENT, &t)) {
if (strncmp("subdevice", t.u.ident.value, t.u.ident.length) != 0) {
goto err;
}
if (! acceptsym(c, tok_LBRACKET, NULL)) { goto err; }
if (! acceptsym(c, tok_INTEGER, &t)) { goto err; }
if (! acceptsym(c, tok_RBRACKET, NULL)) { goto err; }
}
/*
const char *buf = context->buf;
while (*buf && *buf != '}') {
......@@ -63,6 +71,8 @@ static struct moberg_driver_map parse_map(
context->buf = buf + 1;
*/
return result;
err:
exit(1);
}
struct moberg_driver_module moberg_module = {
......
......@@ -11,6 +11,7 @@
#define token moberg_config_parser_token
#define token_kind moberg_config_parser_token_kind
#define acceptsym moberg_config_parser_acceptsym
#define peeksym moberg_config_parser_peeksym
typedef struct moberg_config_parser_token token_t;
typedef struct moberg_config_parser_ident ident_t;
......@@ -47,20 +48,20 @@ out: ;
c->token.kind = tok_CONFIG;
} else if (strncmp("map", v, l) == 0) {
c->token.kind = tok_MAP;
} else if (strncmp("analogin", v, l) == 0) {
} else if (strncmp("analog_in", v, l) == 0) {
c->token.kind = tok_ANALOGIN;
} else if (strncmp("analogout", v, l) == 0) {
} else if (strncmp("analog_out", v, l) == 0) {
c->token.kind = tok_ANALOGOUT;
} else if (strncmp("digitalin", v, l) == 0) {
} else if (strncmp("digital_in", v, l) == 0) {
c->token.kind = tok_DIGITALIN;
} else if (strncmp("digitalout", v, l) == 0) {
} else if (strncmp("digital_out", v, l) == 0) {
c->token.kind = tok_DIGITALOUT;
} else if (strncmp("encoderin", v, l) == 0) {
} else if (strncmp("encoder_in", v, l) == 0) {
c->token.kind = tok_ENCODERIN;
} else {
c->token.kind = tok_IDENT;
}
printf("IDENT: %.*s\n", l, v);
printf("IDENT: %.*s %d\n", l, v, c->token.kind);
}
static const void nextsym_integer(context_t *c)
......@@ -176,12 +177,14 @@ int moberg_config_parser_acceptsym(context_t *c,
token_t *token)
{
if (c->token.kind == kind) {
printf("ACCEPT %d", c->token.kind);
if (token) {
*token = c->token;
}
nextsym(c);
return 1;
}
printf("REJECT %d (%d)", kind, c->token.kind);
return 0;
}
......@@ -214,6 +217,7 @@ err:
static int parse_map(context_t *c,
struct moberg_driver *driver)
{
printf("parsemap");
struct token t;
if (acceptsym(c, tok_ANALOGIN, &t) ||
acceptsym(c, tok_ANALOGOUT, &t) ||
......@@ -252,10 +256,15 @@ static int parse_device(context_t *c,
{
if (! acceptsym(c, tok_LBRACE, NULL)) { goto err; }
for (;;) {
struct token t;
peeksym(c, &t);
printf("PEEK %d", t.kind);
if (acceptsym(c, tok_CONFIG, NULL)) {
driver->module.parse_config(c);
} else if (acceptsym(c, tok_MAP, NULL)) {
parse_map(c, driver);
} else if (acceptsym(c, tok_RBRACE, NULL)) {
break;
} else {
goto err;
}
......@@ -286,6 +295,8 @@ static int parse_config(context_t *c)
{
for (;;) {
struct token t;
peeksym(c, &t);
printf("PEEK %d", t.kind);
if (acceptsym(c, tok_IDENT, &t)) {
printf("DRIVER=%.*s\n", t.u.ident.length, t.u.ident.value);
if (! parse_driver(c, t.u.ident)) { goto err; }
......
......@@ -7,7 +7,11 @@ comedi {
}
/* Moberg mapping[indices] = {driver specific}[indices]
{driver specific} is parsed by parse_map in libmoberg_comedi.so */
map digital_in[0:7] = {subdevice[4]}[0:7] ;
map analog_in[0:7] = subdevice[0][0:7] ;
map analog_out[0:1] = subdevice[1][0:1] ;
map digital_in[0] = subdevice[7][15] ;
map digital_in[1] = subdevice[7][2] ;
map digital_out[0:1] = subdevice[7][0:1] route 16 ;
}
serial2002 {
config {
......@@ -17,5 +21,5 @@ serial2002 {
}
/* Moberg mapping[indices] = {driver specific}[indices]
{driver specific} is parsed by parse_map in libmoberg_serial2002.so */
map digital_in[30:37] = {digital_in}[0:7] ;
map digital_in[30:37] = digital_in[0:7] ;
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment