Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于从文件填充类的Lexer/Parser的语法规则_C++_Parsing_Bison_Lexer - Fatal编程技术网

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

C++ 用于从文件填充类的Lexer/Parser的语法规则,c++,parsing,bison,lexer,C++,Parsing,Bison,Lexer,我想在最简单的层次上使用lexer和解析器来解决以下问题 我有一个文件,其中包含表单的内容 TYPE1 ABCR { TYPE2 EFG { omega 1 TYPE3 AFGH { alpha 1 beta 1 2 gamma 1 3 4 } } } TYPE1 CFGRT { TYPE2 EFGI

我想在最简单的层次上使用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  

}
类类型1
{
列出清单;
}
类别2
{
ω-abc;
列出清单;
}
第三类
{
vec2β
vec3伽马
}
现在,我的文件的规范可以通过在每个级别上添加更多属性来更改 还有更多层次结构级别,如TYPE4

因此,我想让我的解析保持通用性和可扩展性

在这种情况下,如果我使用lexer和解析器,比如Flex/Bison,那么该语言是什么
要为他们设置语法规则吗?

好吧,因为现在似乎没有任何实际的Flex/Bison用户,而且您确实说过“…像Flex/Bison这样的lexer和解析器…”,下面是我使用的(专有)解析器生成器的大致外观:

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\u literal
都是终端。

谢谢……什么是问号“?”和“+”以及如何分别处理读取vec3和vec2的情况?另外,我假设你的意思是,在上面的每一条规则中,我都会做一个动作,在这个动作中,我会实例化一个新对象并正确赋值??表示括号中的内容是可选的,+表示括号中的内容至少重复一次。是的,您将拥有生成对象和赋值的操作。在操作代码中,我如何获得vec3和vec2的各个组件,我们是否使用类似于[integer\u literal][0]、[integer\u literal][1],对于独立组件等?@500内部服务器错误我可以问一下,您使用的是什么商业产品而不是flex/bison吗?@Bort:我正在使用我开发的内部产品,我希望在我有时间清理一些零碎的东西时,能够将其发布到公共领域。它有点类似于coco/r,不过如果您现在正在寻找Flex/Bison的替代品。解析当前使用普通的while循环,我想转到lexer解析器,因为我的主要规范不断变化,所以我不想继续编辑代码,以便使用while循环进行解析