|
Packit |
d394d9 |
/* Copyright (C) 2002 Bjoern Beutel. */
|
|
Packit |
d394d9 |
|
|
Packit |
d394d9 |
/* Description. =============================================================*/
|
|
Packit |
d394d9 |
|
|
Packit |
d394d9 |
/* This module parses Malaga values. */
|
|
Packit |
d394d9 |
|
|
Packit |
d394d9 |
/* Includes. ================================================================*/
|
|
Packit |
d394d9 |
|
|
Packit |
d394d9 |
#include <stdio.h>
|
|
Packit |
d394d9 |
#include <setjmp.h>
|
|
Packit |
d394d9 |
#include <glib.h>
|
|
Packit |
d394d9 |
#include "basic.h"
|
|
Packit |
d394d9 |
#include "pools.h"
|
|
Packit |
d394d9 |
#include "values.h"
|
|
Packit |
d394d9 |
#include "symbols.h"
|
|
Packit |
d394d9 |
#include "scanner.h"
|
|
Packit |
d394d9 |
#include "hangul.h"
|
|
Packit |
d394d9 |
#include "value_parser.h"
|
|
Packit |
d394d9 |
|
|
Packit |
d394d9 |
/* Functions. ===============================================================*/
|
|
Packit |
d394d9 |
|
|
Packit |
d394d9 |
static void
|
|
Packit |
d394d9 |
parse_symbol( void )
|
|
Packit |
d394d9 |
/* Parse a symbol and push it on the VALUE_STACK. */
|
|
Packit |
d394d9 |
{
|
|
Packit |
d394d9 |
test_token( TOK_IDENT );
|
|
Packit |
d394d9 |
push_symbol_value( find_symbol( token_name ) );
|
|
Packit |
d394d9 |
read_next_token();
|
|
Packit |
d394d9 |
}
|
|
Packit |
d394d9 |
|
|
Packit |
d394d9 |
/*---------------------------------------------------------------------------*/
|
|
Packit |
d394d9 |
|
|
Packit |
d394d9 |
void
|
|
Packit |
d394d9 |
parse_a_value( void )
|
|
Packit |
d394d9 |
/* Parse a value (use scanner input) and leave it on the VALUE_STACK. */
|
|
Packit |
d394d9 |
{
|
|
Packit |
d394d9 |
int_t n; /* Number of values in list or record. */
|
|
Packit |
d394d9 |
|
|
Packit |
d394d9 |
switch (next_token)
|
|
Packit |
d394d9 |
{
|
|
Packit |
d394d9 |
case '<':
|
|
Packit |
d394d9 |
/* Parse a list. */
|
|
Packit |
d394d9 |
read_next_token();
|
|
Packit |
d394d9 |
n = 0;
|
|
Packit |
d394d9 |
if (next_token != '>')
|
|
Packit |
d394d9 |
{
|
|
Packit |
d394d9 |
parse_a_value();
|
|
Packit |
d394d9 |
n++;
|
|
Packit |
d394d9 |
while (next_token == ',')
|
|
Packit |
d394d9 |
{
|
|
Packit |
d394d9 |
read_next_token();
|
|
Packit |
d394d9 |
parse_a_value();
|
|
Packit |
d394d9 |
n++;
|
|
Packit |
d394d9 |
}
|
|
Packit |
d394d9 |
}
|
|
Packit |
d394d9 |
parse_token( '>' );
|
|
Packit |
d394d9 |
build_list(n);
|
|
Packit |
d394d9 |
break;
|
|
Packit |
d394d9 |
case '[':
|
|
Packit |
d394d9 |
/* Parse a record. */
|
|
Packit |
d394d9 |
read_next_token();
|
|
Packit |
d394d9 |
n = 0;
|
|
Packit |
d394d9 |
if (next_token != ']')
|
|
Packit |
d394d9 |
{
|
|
Packit |
d394d9 |
parse_symbol();
|
|
Packit |
d394d9 |
parse_token( ':' );
|
|
Packit |
d394d9 |
parse_a_value();
|
|
Packit |
d394d9 |
n++;
|
|
Packit |
d394d9 |
while (next_token == ',')
|
|
Packit |
d394d9 |
{
|
|
Packit |
d394d9 |
read_next_token();
|
|
Packit |
d394d9 |
parse_symbol();
|
|
Packit |
d394d9 |
parse_token( ':' );
|
|
Packit |
d394d9 |
parse_a_value();
|
|
Packit |
d394d9 |
n++;
|
|
Packit |
d394d9 |
}
|
|
Packit |
d394d9 |
}
|
|
Packit |
d394d9 |
parse_token( ']' );
|
|
Packit |
d394d9 |
build_record(n);
|
|
Packit |
d394d9 |
break;
|
|
Packit |
d394d9 |
case TOK_IDENT:
|
|
Packit |
d394d9 |
/* Parse a symbol. */
|
|
Packit |
d394d9 |
parse_symbol();
|
|
Packit |
d394d9 |
break;
|
|
Packit |
d394d9 |
case TOK_STRING:
|
|
Packit |
d394d9 |
/* Parse a string. */
|
|
Packit |
d394d9 |
encode_hangul( &token_string );
|
|
Packit |
d394d9 |
push_string_value( token_string, NULL );
|
|
Packit |
d394d9 |
read_next_token();
|
|
Packit |
d394d9 |
break;
|
|
Packit |
d394d9 |
case TOK_NUMBER:
|
|
Packit |
d394d9 |
/* Parse a number. */
|
|
Packit |
d394d9 |
push_number_value( token_number );
|
|
Packit |
d394d9 |
read_next_token();
|
|
Packit |
d394d9 |
break;
|
|
Packit |
d394d9 |
case '-':
|
|
Packit |
d394d9 |
/* Parse a negative number. */
|
|
Packit |
d394d9 |
read_next_token();
|
|
Packit |
d394d9 |
test_token( TOK_NUMBER );
|
|
Packit |
d394d9 |
push_number_value( -token_number );
|
|
Packit |
d394d9 |
read_next_token();
|
|
Packit |
d394d9 |
break;
|
|
Packit |
d394d9 |
default:
|
|
Packit |
d394d9 |
complain( "Value expected, not %s.", token_as_text( next_token ) );
|
|
Packit |
d394d9 |
}
|
|
Packit |
d394d9 |
}
|
|
Packit |
d394d9 |
|
|
Packit |
d394d9 |
/* End of file. =============================================================*/
|