Difference between revisions of "Talk:Code Completion Design"
m (→others) |
|||
(7 intermediate revisions by 2 users not shown) | |||
Line 24: | Line 24: | ||
e.g. | e.g. | ||
− | < | + | <source lang = "cpp">delete p; |
MyClass.fun(); | MyClass.fun(); | ||
MyClass->fun(); | MyClass->fun(); | ||
− | </ | + | </source> |
==deal with { == | ==deal with { == | ||
The parser will skip the context between { and } if the usebuffer or the bufferskipblock is true in the option.eg. | The parser will skip the context between { and } if the usebuffer or the bufferskipblock is true in the option.eg. | ||
− | < | + | <source lang = "cpp"> |
int main() {cout <<endl;} | int main() {cout <<endl;} | ||
− | </ | + | </source> |
==deal with }== | ==deal with }== | ||
Line 45: | Line 45: | ||
e.g. | e.g. | ||
− | < | + | <source lang = "cpp"> |
class MyClass | class MyClass | ||
{ | { | ||
Line 52: | Line 52: | ||
int y; | int y; | ||
}; | }; | ||
− | </ | + | </source> |
Here the scope is public. | Here the scope is public. | ||
==deal with while if do else for switch== | ==deal with while if do else for switch== | ||
skip the context until it meet ;or } if the usebuffer or the bufferskipblock is true in the option.e.g. | skip the context until it meet ;or } if the usebuffer or the bufferskipblock is true in the option.e.g. | ||
− | < | + | <source lang = "cpp"> |
if (a > b) | if (a > b) | ||
Line 65: | Line 65: | ||
c = b; | c = b; | ||
− | </ | + | </source> |
==deal with typedef== | ==deal with typedef== | ||
When parser meet this token ,it calls HandleTypedef function to deal with it if the option handletypedef is true. | When parser meet this token ,it calls HandleTypedef function to deal with it if the option handletypedef is true. | ||
Otherwise,it will skip the next context until it meet ;or } | Otherwise,it will skip the next context until it meet ;or } | ||
− | < | + | <source lang = "cpp"> |
typedef int INT; | typedef int INT; | ||
− | </ | + | </source> |
More Information, see below. | More Information, see below. | ||
Line 79: | Line 79: | ||
Because the parser believe that there is no chance for variab definition here. e.g. | Because the parser believe that there is no chance for variab definition here. e.g. | ||
− | < | + | <source lang = "cpp"> |
int add(int a, int b) | int add(int a, int b) | ||
Line 87: | Line 87: | ||
} | } | ||
− | </ | + | </source> |
==deal with const == | ==deal with const == | ||
just clear the m_str.It means that maybe a new variable or function is going to be defined. | just clear the m_str.It means that maybe a new variable or function is going to be defined. | ||
Line 93: | Line 93: | ||
e.g. | e.g. | ||
− | < | + | <source lang = "cpp"> |
const int a = 3; | const int a = 3; | ||
const int getVal(int a); | const int getVal(int a); | ||
− | </ | + | </source> |
==deal with extern == | ==deal with extern == | ||
Line 116: | Line 116: | ||
e.g. | e.g. | ||
− | < | + | <source lang = "cpp"> |
#include <iostream> | #include <iostream> | ||
Line 126: | Line 126: | ||
#endif | #endif | ||
− | </ | + | </source> |
==deal with using == | ==deal with using == | ||
skip the context until it meet ;or } | skip the context until it meet ;or } | ||
− | < | + | |
+ | e.g. | ||
+ | <source lang = "cpp"> | ||
using namespace std; | using namespace std; | ||
− | </ | + | </source> |
==deal with namespace == | ==deal with namespace == | ||
Line 138: | Line 140: | ||
==deal with class == | ==deal with class == | ||
− | handle class if the option | + | handle class if handleclass in the option is true.Otherwise skip context until the parser meet } or ; |
− | parser meet } or ; e.g. | + | |
− | < | + | e.g. |
+ | <source lang = "cpp"> | ||
class Myclass | class Myclass | ||
{ | { | ||
Line 148: | Line 151: | ||
}; | }; | ||
− | </ | + | </source> |
==deal with struct == | ==deal with struct == | ||
Line 162: | Line 165: | ||
==deal with operator == | ==deal with operator == | ||
eg. | eg. | ||
− | < | + | <source lang = "cpp"> |
MyClass operator () (size_t param); | MyClass operator () (size_t param); | ||
MyClass operator += (MyClass param); | MyClass operator += (MyClass param); | ||
− | </ | + | </source> |
== others == | == others == | ||
It means that the current token is not any one above.So the next token should be judged. | It means that the current token is not any one above.So the next token should be judged. | ||
Line 173: | Line 176: | ||
1) the next one's fisrt char is ( | 1) the next one's fisrt char is ( | ||
− | < | + | <source lang = "cpp"> |
Macro(a, b) fun(int a , int b); | Macro(a, b) fun(int a , int b); | ||
vector<int> fun(int a , int b); | vector<int> fun(int a , int b); | ||
− | </ | + | </source> |
− | 2): and the current is not public /protected /private | + | 2) : and the current is not public /protected /private |
eg. | eg. | ||
− | < | + | <source lang = "cpp">int x:1,y:1,z:1;</source> |
3), | 3), | ||
e.g. | e.g. | ||
− | < | + | <source lang = "cpp">int x , y, z;</source> |
4)< | 4)< | ||
− | |||
− | |||
− | e.g. std::map<int, int> somevar; | + | e.g. |
− | </ | + | <source lang = "cpp"> |
+ | someclass<void>::memberfunc; | ||
+ | |||
+ | std::map<int, int> somevar; | ||
+ | </source> | ||
5):: | 5):: | ||
+ | |||
e.g. | e.g. | ||
− | < | + | <source lang = "cpp"> |
std::string | std::string | ||
MyClass MyClass ::fun() {} | MyClass MyClass ::fun() {} | ||
− | </ | + | </source> |
6) ; | 6) ; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Latest revision as of 15:21, 17 December 2009
Should be added to the article page soon
Parsethread
Three important functions should be introduced before we started .
- SkipToOneOfChars This function is used to skip any tokens until it meet a char in chars which is the parameter you pass.
- SkipBlock This function is used to skip block between two brances,for example ,{[()]}.If the block contain the proprocessor ,it will deal with it.
- SkipAngleBraces This function is used to skip the context between < and >.
The m_Str is used to store the token can not be decided .
The three functions above are used to skip tokens we wantn't to parse.It can acclerate the speed of parser.
In the function DoParse,it analyze the tokens it meets as follow:
clear m_Str
just clear the m_str,because the parser believe the token has been recognized correctly. e.g. int a;
deal with delete . ->
when parser meet these three tokens it will skip the next tokens until it meet token ; or }
e.g.
delete p;
MyClass.fun();
MyClass->fun();
deal with {
The parser will skip the context between { and } if the usebuffer or the bufferskipblock is true in the option.eg.
int main() {cout <<endl;}
deal with }
The parser clears the scope and domain.So it means it's a new begin. By the way,it also clear m_Str.
deal with :
When parser meets this token.It will judge what the last token is. And set the related scope.
e.g.
class MyClass
{
public :
int x;
int y;
};
Here the scope is public.
deal with while if do else for switch
skip the context until it meet ;or } if the usebuffer or the bufferskipblock is true in the option.e.g.
if (a > b)
c = a;
else
c = b;
deal with typedef
When parser meet this token ,it calls HandleTypedef function to deal with it if the option handletypedef is true. Otherwise,it will skip the next context until it meet ;or }
typedef int INT;
More Information, see below.
deal with return :
The parser skips the context until it meet the ; or }
Because the parser believe that there is no chance for variab definition here. e.g.
int add(int a, int b)
{
return a+b;
}
deal with const
just clear the m_str.It means that maybe a new variable or function is going to be defined.
e.g.
const int a = 3;
const int getVal(int a);
deal with extern
call DoParse if the next token is "c",otherwise,skip the context until it meet ;
deal with __asm
skip the context until it meet ;
deal with static virtual inline
do nothing
deal with #
Handle include if the next token is include.
Handle define if the next token is define.
otherwise handle the preprocessor block.
e.g.
#include <iostream>
#define MAXNUM 10
#if
#else
#endif
deal with using
skip the context until it meet ;or }
e.g.
using namespace std;
deal with namespace
skip context between < and > if the next token is <
deal with class
handle class if handleclass in the option is true.Otherwise skip context until the parser meet } or ;
e.g.
class Myclass
{
int x;
int y;
};
deal with struct
the same to class
deal with enum
the same to class
deal with untion
skip the context until it meet }or; call DoParse to analyze the context in the untion.
deal with operator
eg.
MyClass operator () (size_t param);
MyClass operator += (MyClass param);
others
It means that the current token is not any one above.So the next token should be judged.
According to the next token ,it can be divided into several situation as followed.
1) the next one's fisrt char is (
Macro(a, b) fun(int a , int b);
vector<int> fun(int a , int b);
2) : and the current is not public /protected /private
eg.
int x:1,y:1,z:1;
3),
e.g.
int x , y, z;
4)<
e.g.
someclass<void>::memberfunc;
std::map<int, int> somevar;
5)::
e.g.
std::string
MyClass MyClass ::fun() {}
6) ;