C++ 用于从文件填充类的Lexer/Parser的语法规则
我想在最简单的层次上使用lexer和解析器来解决以下问题 我有一个文件,其中包含表单的内容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
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循环进行解析