aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--doc/ScintillaHistory.html5
-rw-r--r--lexers/LexCPP.cxx14
2 files changed, 14 insertions, 5 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html
index b8225bcc5..1cc91e184 100644
--- a/doc/ScintillaHistory.html
+++ b/doc/ScintillaHistory.html
@@ -557,11 +557,16 @@
<li>
The Bash lexer implements substyles for multiple sets of keywords and supports SCI_PROPERTYNAMES.
<a href="https://sourceforge.net/p/scintilla/bugs/2054/">Bug #2054</a>.
+ </li>
<li>
The C++ lexer interprets continued preprocessor lines correctly by reading all of
the logical line.
<a href="https://sourceforge.net/p/scintilla/bugs/2062/">Bug #2062</a>.
</li>
+ <li>
+ The C++ lexer interprets preprocessor arithmetic expressions containing multiplicative and additive
+ operators correctly by following operator precedence rules.
+ <a href="https://sourceforge.net/p/scintilla/bugs/2069/">Bug #2069</a>.
</li>
<li>
Notify with SC_UPDATE_SELECTION when user performs a multiple selection add.
diff --git a/lexers/LexCPP.cxx b/lexers/LexCPP.cxx
index e8cb75e43..6e438c7ec 100644
--- a/lexers/LexCPP.cxx
+++ b/lexers/LexCPP.cxx
@@ -484,7 +484,8 @@ class LexerCPP : public ILexerWithMetaData {
bool caseSensitive;
CharacterSet setWord;
CharacterSet setNegationOp;
- CharacterSet setArithmethicOp;
+ CharacterSet setAddOp;
+ CharacterSet setMultOp;
CharacterSet setRelOp;
CharacterSet setLogicalOp;
CharacterSet setWordStart;
@@ -525,7 +526,8 @@ public:
caseSensitive(caseSensitive_),
setWord(CharacterSet::setAlphaNum, "._", 0x80, true),
setNegationOp(CharacterSet::setNone, "!"),
- setArithmethicOp(CharacterSet::setNone, "+-/*%"),
+ setAddOp(CharacterSet::setNone, "+-"),
+ setMultOp(CharacterSet::setNone, "*/%"),
setRelOp(CharacterSet::setNone, "=!<>"),
setLogicalOp(CharacterSet::setNone, "|&"),
subStyles(styleSubable, 0x80, 0x40, activeFlag) {
@@ -1628,13 +1630,15 @@ void LexerCPP::EvaluateTokens(std::vector<std::string> &tokens, const SymbolTabl
}
// Evaluate expressions in precedence order
- enum precedence { precArithmetic, precRelative, precLogical };
- for (int prec=precArithmetic; prec <= precLogical; prec++) {
+ enum precedence { precMult, precAdd, precRelative
+ , precLogical, /* end marker */ precLast };
+ for (int prec = precMult; prec < precLast; prec++) {
// Looking at 3 tokens at a time so end at 2 before end
for (size_t k=0; (k+2)<tokens.size();) {
const char chOp = tokens[k+1][0];
if (
- ((prec==precArithmetic) && setArithmethicOp.Contains(chOp)) ||
+ ((prec==precMult) && setMultOp.Contains(chOp)) ||
+ ((prec==precAdd) && setAddOp.Contains(chOp)) ||
((prec==precRelative) && setRelOp.Contains(chOp)) ||
((prec==precLogical) && setLogicalOp.Contains(chOp))
) {