zoukankan
html css js c++ java
一个通用的语法解析器
//
---------------------------------------------------------------------------------------------
Parser::Parser()
{
}
//
---------------------------------------------------------------------------------------------
Parser::
~
Parser()
{
}
//
---------------------------------------------------------------------------------------------
int
Parser::Call(
int
id, std::vector
<
std::
string
>
&
args)
{
switch
( id )
{
case
1
:
return
g_Renderer
->
world_begin();
case
2
:
return
g_Renderer
->
world_end();
case
3
:
return
g_Renderer
->
frame_begin();
case
4
:
return
g_Renderer
->
frame_end();
case
5
:
return
g_Renderer
->
group_begin( AsString(args[
0
]) );
case
6
:
return
g_Renderer
->
group_end();
case
7
:
return
g_Renderer
->
init_instance( AsString(args[
0
]) );
case
8
:
return
g_Renderer
->
object_begin( AsString(args[
0
]), AsString(args[
1
]) );
case
9
:
return
g_Renderer
->
object_end();
case
10
:
return
g_Renderer
->
motion_begin();
case
11
:
return
g_Renderer
->
motion_end();
case
12
:
return
g_Renderer
->
vertex( AsFloat(args[
0
]), AsFloat(args[
1
]), AsFloat(args[
2
]),
AsFloat(args[
3
]), AsFloat(args[
4
]) );
case
13
:
return
g_Renderer
->
vertex( AsInteger(args[
0
]) );
case
14
:
return
g_Renderer
->
normal( AsFloat(args[
0
]), AsFloat(args[
1
]), AsFloat(args[
2
]) );
case
15
:
return
g_Renderer
->
primitive_begin( AsString(args[
0
]) );
case
16
:
return
g_Renderer
->
primitive_end();
case
17
:
return
g_Renderer
->
texture( AsString(args[
0
]), AsString(args[
1
]) );
case
18
:
return
g_Renderer
->
translate( AsFloat(args[
0
]), AsFloat(args[
1
]), AsFloat(args[
2
]) );
case
19
:
return
g_Renderer
->
rotate( AsFloat(args[
0
]), AsFloat(args[
1
]), AsFloat(args[
2
]) );
case
20
:
return
g_Renderer
->
scale( AsFloat(args[
0
]), AsFloat(args[
1
]), AsFloat(args[
2
]) );
case
21
:
return
g_Renderer
->
material_begin( AsString(args[
0
]) );
case
22
:
return
g_Renderer
->
material_end();
case
23
:
return
g_Renderer
->
light_begin( AsString(args[
0
]), AsString(args[
1
]) );
case
24
:
return
g_Renderer
->
light_end();
case
25
:
return
g_Renderer
->
select_group( AsString(args[
0
]) );
case
26
:
return
g_Renderer
->
delete_group( AsString(args[
0
]) );
case
27
:
return
g_Renderer
->
select_object( AsString(args[
0
]) );
case
28
:
return
g_Renderer
->
delete_object( AsString(args[
0
]) );
case
29
:
return
g_Renderer
->
select_material( AsString(args[
0
]) );
case
30
:
return
g_Renderer
->
delete_material( AsString(args[
0
]) );
case
31
:
return
g_Renderer
->
select_light( AsString(args[
0
]) );
case
32
:
return
g_Renderer
->
select_light( AsString(args[
0
]) );
case
33
:
return
g_Renderer
->
select_end();
default
:
return
FALSE;
}
}
//
---------------------------------------------------------------------------------------------
int
Parser::SetOption(
int
id, std::
string
&
value)
{
if
( id
>=
FLOAT_OPTION_BEGIN
&&
id
<=
FLOAT_OPTION_END )
return
g_Renderer
->
set_option( id, AsFloat(value) );
else
if
( id
>=
INTEGER_OPTION_BEGIN
&&
id
<=
INTEGER_OPTION_END )
return
g_Renderer
->
set_option( id, AsInteger(value) );
else
if
( id
>=
STRING_OPTION_BEGIN
&&
id
<=
STRING_OPTION_END )
return
g_Renderer
->
set_option( id, AsString(value) );
else
if
( id
>=
BOOLEAN_OPTION_BEGIN
&&
id
<=
BOOLEAN_OPTION_END )
return
g_Renderer
->
set_option( id, AsBoolean(value) );
else
{
std::vector
<
float
>
vec;
AsVector( value, vec );
switch
( vec.size() )
{
case
2
:
return
g_Renderer
->
set_option( id, vec[
0
], vec[
1
] );
case
3
:
return
g_Renderer
->
set_option( id, vec[
0
], vec[
1
], vec[
2
] );
case
4
:
return
g_Renderer
->
set_option( id, vec[
0
], vec[
1
], vec[
2
], vec[
3
] );
default
:
return
FALSE;
}
}
}
//
---------------------------------------------------------------------------------------------
int
Parser::SetParameter(
const
char
*
name, std::
string
&
value)
{
int
ret
=
TRUE;
if
( (ret
=
g_Renderer
->
set_parameter( name, AsFloat(value) ))
!=
TRUE )
{
if
( (ret
=
g_Renderer
->
set_parameter( name, AsInteger(value) ))
!=
TRUE )
{
if
( (ret
=
g_Renderer
->
set_parameter( name, AsBoolean(value) ))
!=
TRUE )
{
if
( (ret
=
g_Renderer
->
set_parameter( name, AsString(value) ))
!=
TRUE )
{
std::vector
<
float
>
vec;
AsVector( value, vec );
switch
( vec.size() )
{
case
2
:
ret
=
g_Renderer
->
set_parameter( name, vec[
0
], vec[
1
] );
break
;
case
3
:
ret
=
g_Renderer
->
set_parameter( name, vec[
0
], vec[
1
], vec[
2
] );
break
;
case
4
:
ret
=
g_Renderer
->
set_parameter( name, vec[
0
], vec[
1
], vec[
2
], vec[
3
] );
break
;
default
:
return
FALSE;
}
}
}
}
}
return
ret;
}
//
---------------------------------------------------------------------------------------------
int
Parser::Load(
const
char
*
name)
{
std::ifstream file( name );
if
(
!
file )
return
FALSE;
std::
string
cstr;
size_t pos
=
0
;
int
ret
=
TRUE;
keepOnLoading
=
true
;
while
( keepOnLoading
&&
ReadString( file, cstr ) )
{
g_Window
->
print( cstr.c_str() );
if
( (pos
=
cstr.find( KEYWORD_COMMENT ))
!=
std::
string
::npos )
cstr
=
cstr.substr(
0
, pos );
TrimLeft( cstr );
TrimRight( cstr );
if
( cstr.empty() )
continue
;
cstr
+=
KEYWORD_NEWLINE;
std::vector
<
std::
string
>
args;
size_t len;
for
(
int
i
=
0
; i
<
FUNCTION_AMOUNT;
++
i)
{
len
=
strlen( SDL[i].name );
if
( cstr.substr(
0
, len )
==
SDL[i].name )
{
if
( i
==
20
/**/
/*
material
*/
&&
g_Renderer
->
objectBegin )
break
;
else
if
( i
==
11
/**/
/*
vertex
*/
&&
g_Renderer
->
primitiveBegin )
continue
;
if
( cstr[len]
==
KEYWORD_ARGUMENT_BEGIN1
||
cstr[len]
==
KEYWORD_ARGUMENT_BEGIN2
||
cstr[len]
==
KEYWORD_NEWLINE )
{
std::
string
para, sect;
para
=
cstr.substr( len
+
1
, cstr.length()
-
len
-
1
);
for
(
int
j
=
0
; j
<
(
int
) para.length();
++
j)
{
if
( para[j]
!=
KEYWORD_ARGUMENT_DELIMITER
&&
para[j]
!=
KEYWORD_ARGUMENT_END )
sect
+=
para[j];
else
{
args.push_back( sect );
sect.clear();
}
}
if
(
!
args.empty() )
{
for
(
int
j
=
0
; j
<
(
int
) args.size()
-
1
;
++
j)
{
TrimLeft( args[j] );
TrimRight( args[j] );
}
TrimLeft( args.back() );
}
if
( args.size()
==
SDL[i].noArg )
{
if
( (ret
=
Call( i
+
1
, args ))
!=
TRUE )
goto
OPTIONS;
else
goto
END_OF_LOOP;
}
}
}
}
OPTIONS:
for
(
int
i
=
0
; i
<
OPTION_AMOUNT;
++
i)
{
len
=
strlen( OptMap[i].name );
if
( cstr.substr(
0
, len )
==
OptMap[i].name )
{
for
(
int
j
=
(
int
) len; j
<
(
int
) cstr.length();
++
j)
{
if
( cstr[j]
!=
KEYWORD_SPACE1
&&
cstr[j]
!=
KEYWORD_SPACE2
&&
cstr[j]
!=
KEYWORD_SPACE3
&&
cstr[j]
!=
KEYWORD_SET1
&&
cstr[j]
!=
KEYWORD_SET2 )
{
goto
END_OF_LOOP;
}
else
if
( cstr[j]
==
KEYWORD_SET1
||
cstr[j]
==
KEYWORD_SET2 )
{
std::
string
value;
value
=
cstr.substr( j
+
1
, cstr.length()
-
j
-
1
);
TrimLeft( value );
if
( (ret
=
SetOption( OptMap[i].id, value ))
!=
TRUE )
goto
PARAMETERS;
else
goto
END_OF_LOOP;
}
}
}
}
PARAMETERS:
if
( (pos
=
cstr.find( KEYWORD_CUSTOM_SET ))
!=
std::
string
::npos )
{
std::
string
value;
value
=
cstr.substr( pos
+
1
, cstr.length()
-
pos
-
1
);
cstr
=
cstr.substr(
0
, pos );
TrimLeft( cstr );
TrimRight( cstr );
TrimLeft( value );
TrimRight( value );
if
( (ret
=
SetParameter( cstr.c_str(), value ))
!=
TRUE )
{
return
ret;
}
}
else
return
FALSE;
END_OF_LOOP:;
}
;
return
TRUE;
}
//
---------------------------------------------------------------------------------------------
bool
Parser::ReadString(std::ifstream
&
file, std::
string
&
str)
{
str.clear();
char
ch;
while
( file.
get
(ch) )
{
if
( ch
==
KEYWORD_NEWLINE )
return
true
;
str
+=
ch;
}
;
return
false
;
}
//
---------------------------------------------------------------------------------------------
void
Parser::TrimLeft(std::
string
&
str)
{
for
(
int
i
=
0
; i
<
(
int
) str.length();
++
i)
{
if
( str[i]
!=
KEYWORD_SPACE1
&&
str[i]
!=
KEYWORD_SPACE2
&&
str[i]
!=
KEYWORD_SPACE3 )
{
str.erase(
0
, i );
return
;
}
}
str.clear();
}
//
---------------------------------------------------------------------------------------------
void
Parser::TrimRight(std::
string
&
str)
{
for
(
int
i
=
(
int
) str.length()
-
1
; i
>=
0
;
--
i)
{
if
( str[i]
!=
KEYWORD_SPACE1
&&
str[i]
!=
KEYWORD_SPACE2
&&
str[i]
!=
KEYWORD_SPACE3 )
{
str.erase( i
+
1
, str.length()
-
i
-
1
);
return
;
}
}
str.clear();
}
//
---------------------------------------------------------------------------------------------
float
Parser::AsFloat(
const
std::
string
&
str)
{
return
(
float
) atof( str.c_str() );
}
//
---------------------------------------------------------------------------------------------
int
Parser::AsInteger(
const
std::
string
&
str)
{
return
atoi( str.c_str() );
}
//
---------------------------------------------------------------------------------------------
bool
Parser::AsBoolean(std::
string
&
str)
{
if
( str[str.length()
-
1
]
==
KEYWORD_NEWLINE )
str.erase( str.end()
-
1
);
if
( str
==
KEYWORD_TRUE1
||
str
==
KEYWORD_TRUE2 )
return
true
;
else
return
false
;
}
//
---------------------------------------------------------------------------------------------
const
char
*
Parser::AsString(std::
string
&
str)
{
if
( str[str.length()
-
1
]
==
KEYWORD_NEWLINE )
str.erase( str.end()
-
1
);
if
( str[
0
]
==
KEYWORD_STRING_BEGIN
&&
str[str.length()
-
1
]
==
KEYWORD_STRING_END )
{
str.erase( str.begin() );
str.erase( str.end()
-
1
);
return
str.c_str();
}
else
return
NULL;
}
//
---------------------------------------------------------------------------------------------
bool
Parser::AsVector(std::
string
&
str, std::vector
<
float
>
&
vec)
{
if
( str[str.length()
-
1
]
==
KEYWORD_NEWLINE )
str.erase( str.end()
-
1
);
if
( str[
0
]
==
KEYWORD_VECTOR_BEGIN
&&
str[str.length()
-
1
]
==
KEYWORD_VECTOR_END )
{
std::
string
sect;
for
(
int
i
=
1
; i
<
(
int
) str.length();
++
i)
{
if
( str[i]
!=
KEYWORD_VECTOR_DELIMITER
&&
str[i]
!=
KEYWORD_VECTOR_END )
sect
+=
str[i];
else
{
vec.push_back( (
float
) atof( sect.c_str() ) );
sect.clear();
}
}
return
true
;
}
else
return
false
;
}
查看全文
相关阅读:
Fiddler使用教程(收藏)
js类的几种写法
对js中prototype的理解
【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)--转
js加载顺序
html加载js那些事
HTTP状态码详解
JS编码解码
css绝对定位、相对定位和文档流的那些事
jQuery事件绑定方法bind、 live、delegate和on的区别
原文地址:https://www.cnblogs.com/len3d/p/355876.html
最新文章
IDEA智能提示忽略大小写
Linux基础
iOS事件:触摸事件.运动事件.远程控制事件
iOS ZBarSDK的基本使用:扫描
iOS一些系统事件的生命周期
iOS开发:bitcode介绍和使用cocoapods出现“target overrides the `OTHER_LDFLAGS`……”的解决方案
OC中在.h和.m中声明的属性和成员变量有何区别?
iOS:开发者中心证书创建流程
使用免费内测托管平台fir.im测试
iOS:测试机添加
热门文章
C#23种设计模式
C# 抽象类
C# 面向对象之多态
C# 文件流FileStream 实现多媒体文件复制 StreamReader StreamWriter 读取写入文本
C# Path类 FileStream(文件流) 与 File(文件) 读取的区别
测试断言概述
Visual Studio2015无法启动IIS Express Web 服务器的解决方案
C++使用按位右移/按位左移运算符
C#中let字句
SQLServer一次性删除重复的数据
Copyright © 2011-2022 走看看