用于从文件填充类的Lexer / Parser的语法规则

时间:2012-02-01 18:40:49

标签: c++ parsing bison lexer

我想在最简单的级别使用词法分析器和解析器来解决以下问题

我的文件内容为

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 个答案:

答案 0 :(得分:1)

好吧,因为现在似乎没有任何实际的Flex / Bison用户,因为你确实说过'... lexer和解析器喜欢 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 ]+
    ]?
  '}'
 .

这假设关于哪些部分是保留关键字,哪些部分是可变数据等等,但你应该明白这一点。

identifierinteger_literal是终端。