Правила грамматики для Lexer / Parser для заполнения классов из файла - PullRequest
3 голосов
/ 01 февраля 2012

Я хочу использовать лексер и парсер на самом простом уровне, чтобы решить следующую проблему

У меня есть файл с содержимым формы

TYPE1 ABCR
{

    TYPE2 EFG
    {

        omega 1

        TYPE3 AFGH
        {
            alpha 1
            beta 1 2 
            gamma 1 3 4 
        }   

    }

}


TYPE1 CFGRT
{

    TYPE2 EFGI
    {
        omega 0

        TYPE3 AFGHJ
        {

            beta 6 2 
            gamma 1 8 4 
        }   

    }

}

//.... (more members of TYPE1)

У меня есть следующие классы, в которые вышеуказанные данные могут быть проанализированы и заполнены

class TYPE1
{


  List<TYPE2> listelems;

}



class TYPE2
{

    omega abc;
    List<TYPE3> listelems;

}

class TYPE3
{

    vec2 beta
    vec3 gamma  

}

Теперь спецификация моего файла может быть изменена, скажем, больше атрибутов на каждом уровне а также больше уровней иерархии, таких как TYPE4.

Таким образом, я хочу, чтобы мой анализ был универсальным и расширяемым.

В этом случае, если бы я использовал лексер и синтаксический анализатор, такой как Flex / Bison, каким был бы язык грамматические правила, которые будут установлены для них?

1 Ответ

1 голос
/ 02 февраля 2012

Ну, так как сейчас, похоже, нет реальных пользователей Flex / Bison, и поскольку вы сказали «... лексер и парсер , как Flex / Bison ...», вот как это будет выглядеть примерно в (проприетарном) генераторе парсера, который я использую:

TYPE1_clause =
  "TYPE1" identifier
  '{'
    TYPE2_clause
  '}'
 .

TYPE2_clause = 
  "TYPE2" identifier
  '{'
    "omega" integer_literal

    TYPE3_clause
  '}'
 .

TYPE3_clause =
  "TYPE3" identifier
  '{'
    [
      "alpha"
      [ integer_literal ]+
    ]?
    [
      "beta"
      [ integer_literal ]+
    ]?
    [
      "gamma"
      [ integer_literal ]+
    ]?
  '}'
 .

Здесь делается несколько предположений о том, какие части являются зарезервированными ключевыми словами, какие части являются переменными данными и т. Д., Но вы должны понять.

identifier и integer_literal являются клеммами.

...