diff options
author | dos-reis <gdr@axiomatics.org> | 2014-08-30 02:55:43 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2014-08-30 02:55:43 +0000 |
commit | e88dc9861a1d7ae4ca3fca1f5ef14d46f7190812 (patch) | |
tree | d2dfec2283085251c1c17c82ff8a8f484b340056 /src/include/token.H | |
parent | 2989854362732a4b0d61a757766158f643d9504b (diff) | |
download | open-axiom-e88dc9861a1d7ae4ca3fca1f5ef14d46f7190812.tar.gz |
Add Lisp punctuators to the generic lexer.
Diffstat (limited to 'src/include/token.H')
-rw-r--r-- | src/include/token.H | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/include/token.H b/src/include/token.H index 9837bda0..719f6e5f 100644 --- a/src/include/token.H +++ b/src/include/token.H @@ -103,6 +103,17 @@ namespace OpenAxiom { return p; } + inline FragmentCursor operator++(FragmentCursor& p, int) { + auto q = p; + ++p; + return q; + } + + inline FragmentCursor& operator--(FragmentCursor& p) { + --p.column; + return p; + } + // -- Exception types struct EndOfStringUnseen { LineNumber line; @@ -512,6 +523,23 @@ namespace OpenAxiom { identifier(frag(pos), pos.column, t, dialect); } + template<typename Frag, typename Tok> + static void + sharp_et_al(Frag& frag, FragmentCursor& pos, Tok& t, Language dialect) { + if (dialect != Language::Lisp) + operator_token(t, TokenValue::Sharp); + else if (frag.covering(pos)) + switch (frag[pos++]) { + case '(': punctuator_token(t, TokenValue::SharpLeftParen); break; + case '\'': operator_token(t, TokenValue::SharpApostrophe); break; + case ':': operator_token(t, TokenValue::SharpColon); break; + case '+': punctuator_token(t, TokenValue::SharpPlus); break; + case '-': punctuator_token(t, TokenValue::SharpMinus); break; + case '.': operator_token(t, TokenValue::SharpDot); break; + default: --pos; break; + } + } + template<typename Frag, typename Tok> Tok Tokenizer<Frag, Tok>::get(Language dialect) { @@ -559,7 +587,7 @@ namespace OpenAxiom { } switch (auto c = frag.advance(pos)) { - case '#': operator_token(t, TokenValue::Pound); break; + case '#': sharp_et_al(frag, pos, t, dialect); break; case '@': operator_token(t, TokenValue::At); break; case '^': operator_token(t, TokenValue::Caret); break; case '&': punctuator_token(t, TokenValue::Ampersand); break; |