Blame value_parser.c

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. =============================================================*/