Skip to content

Commit 2a0b2f5

Browse files
authored
Check tokType in match compiler (#4219)
* Check tokType in match compiler * Set keyword when tokenlist is missing
1 parent a7815ed commit 2a0b2f5

3 files changed

Lines changed: 108 additions & 1 deletion

File tree

lib/token.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,37 @@ static const std::unordered_set<std::string> controlFlowKeywords = {
8686
"return"
8787
};
8888

89+
// Another list of keywords
90+
static const std::unordered_set<std::string> baseKeywords = {
91+
"asm",
92+
"auto",
93+
"break",
94+
"case",
95+
"const",
96+
"continue",
97+
"default",
98+
"do",
99+
"else",
100+
"enum",
101+
"extern",
102+
"for",
103+
"goto",
104+
"if",
105+
"inline",
106+
"register",
107+
"restrict",
108+
"return",
109+
"sizeof",
110+
"static",
111+
"struct",
112+
"switch",
113+
"typedef",
114+
"union",
115+
"volatile",
116+
"while",
117+
"void"
118+
};
119+
89120
void Token::update_property_info()
90121
{
91122
setFlag(fIsControlFlowKeyword, controlFlowKeywords.find(mStr) != controlFlowKeywords.end());
@@ -102,6 +133,8 @@ void Token::update_property_info()
102133
tokType(eVariable);
103134
else if (mTokensFrontBack && mTokensFrontBack->list && mTokensFrontBack->list->isKeyword(mStr))
104135
tokType(eKeyword);
136+
else if (baseKeywords.count(mStr) > 0)
137+
tokType(eKeyword);
105138
else if (mTokType != eVariable && mTokType != eFunction && mTokType != eType && mTokType != eKeyword)
106139
tokType(eName);
107140
} else if (std::isdigit((unsigned char)mStr[0]) || (mStr.length() > 1 && mStr[0] == '-' && std::isdigit((unsigned char)mStr[1])))

lib/tokenlist.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ TokenList::TokenList(const Settings* settings) :
5252
mIsCpp(false)
5353
{
5454
mTokensFrontBack.list = this;
55+
mKeywords.insert("asm");
5556
mKeywords.insert("auto");
5657
mKeywords.insert("break");
5758
mKeywords.insert("case");

tools/matchcompiler.py

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,77 @@
2424
import argparse
2525
import errno
2626

27+
tokTypes = {
28+
'+': ['eArithmeticalOp'],
29+
'-': ['eArithmeticalOp'],
30+
'*': ['eArithmeticalOp'],
31+
'/': ['eArithmeticalOp'],
32+
'%': ['eArithmeticalOp'],
33+
'>>': ['eArithmeticalOp'],
34+
'<<': ['eArithmeticalOp'],
35+
'=': ['eAssignmentOp'],
36+
'+=': ['eAssignmentOp'],
37+
'-=': ['eAssignmentOp'],
38+
'*=': ['eAssignmentOp'],
39+
'/=': ['eAssignmentOp'],
40+
'%=': ['eAssignmentOp'],
41+
'&=': ['eAssignmentOp'],
42+
'|=': ['eAssignmentOp'],
43+
'^=': ['eAssignmentOp'],
44+
'&': ['eBitOp'],
45+
'^': ['eBitOp'],
46+
'~': ['eBitOp'],
47+
'true': ['eBoolean'],
48+
'false': ['eBoolean'],
49+
'{': ['eBracket'],
50+
'}': ['eBracket'],
51+
'<': ['eBracket', 'eComparisonOp'],
52+
'>': ['eBracket', 'eComparisonOp'],
53+
'==': ['eComparisonOp'],
54+
'!=': ['eComparisonOp'],
55+
'<=': ['eComparisonOp'],
56+
'>=': ['eComparisonOp'],
57+
'<=>': ['eComparisonOp'],
58+
'...': ['eEllipsis'],
59+
',': ['eExtendedOp'],
60+
'?': ['eExtendedOp'],
61+
':': ['eExtendedOp'],
62+
'(': ['eExtendedOp'],
63+
')': ['eExtendedOp'],
64+
'[': ['eExtendedOp', 'eLambda'],
65+
']': ['eExtendedOp', 'eLambda'],
66+
'++': ['eIncDecOp'],
67+
'--': ['eIncDecOp'],
68+
'asm': ['eKeyword'],
69+
'auto': ['eKeyword', 'eType'],
70+
'break': ['eKeyword'],
71+
'case': ['eKeyword'],
72+
'const': ['eKeyword'],
73+
'continue': ['eKeyword'],
74+
'default': ['eKeyword'],
75+
'do': ['eKeyword'],
76+
'else': ['eKeyword'],
77+
'enum': ['eKeyword'],
78+
'extern': ['eKeyword'],
79+
'for': ['eKeyword'],
80+
'goto': ['eKeyword'],
81+
'if': ['eKeyword'],
82+
'inline': ['eKeyword'],
83+
'register': ['eKeyword'],
84+
'restrict': ['eKeyword'],
85+
'return': ['eKeyword'],
86+
'sizeof': ['eKeyword'],
87+
'static': ['eKeyword'],
88+
'struct': ['eKeyword'],
89+
'switch': ['eKeyword'],
90+
'typedef': ['eKeyword'],
91+
'union': ['eKeyword'],
92+
'volatile': ['eKeyword'],
93+
'while': ['eKeyword'],
94+
'void': ['eKeyword', 'eType'],
95+
'&&': ['eLogicalOp'],
96+
'!': ['eLogicalOp']
97+
}
2798

2899
class MatchCompiler:
29100

@@ -117,7 +188,9 @@ def _compileCmd(tok):
117188
return '(tok->isName() && tok->varId() == varid)'
118189
elif (len(tok) > 2) and (tok[0] == "%"):
119190
print("unhandled:" + tok)
120-
191+
elif tok in tokTypes:
192+
cond = ' || '.join(['tok->tokType() == Token::{}'.format(tokType) for tokType in tokTypes[tok]])
193+
return '(({cond}) && tok->str() == MatchCompiler::makeConstString("{tok}"))'.format(cond=cond, tok=tok)
121194
return (
122195
'(tok->str() == MatchCompiler::makeConstString("' + tok + '"))'
123196
)

0 commit comments

Comments
 (0)