mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-04-08 17:15:37 +02:00
Release 5.5.2 ( https://www.scintilla.org/scintilla552.zip ) Released 21 August 2024. Add SCI_SETCOPYSEPARATOR for separator between parts of a multiple selection when copied to the clipboard. Feature #1530. Add SCI_GETUNDOSEQUENCE to determine whether an undo sequence is active and its nesting depth. Add SCI_STYLESETSTRETCH to support condensed and expanded text styles. Add SCI_LINEINDENT and SCI_LINEDEDENT. Feature #1524. Fix bug on Cocoa where double-click stopped working when system had been running for a long time. On Cocoa implement more values of font weight and stretch. Release 5.4.0 ( https://www.scintilla.org/lexilla540.zip ) Released 21 August 2024. Inside Lexilla, LexerModule instances are now const. This will require changes to applications that modify Lexilla.cxx, which may be done to add custom lexers. Lexer added for TOML "toml". Bash: Handle backslash in heredoc delimiter. Issue #257. Progress: Fix lexing of nested comments. Pull request #258. Force lower-casing of case-insensitive keyword lists so keywords match in some lexers. Issue #259. Close #15564
226 lines
4.9 KiB
C++
226 lines
4.9 KiB
C++
// Scintilla source code edit control
|
|
/** @file LexMaxima.cxx
|
|
** Lexer for Maxima (http://maxima.sourceforge.net).
|
|
** Written by Gunter Königsmann based on the lisp lexer by Alexey Yutkin and Neil Hodgson .
|
|
**/
|
|
// Copyright 2018 by Gunter Königsmann <wxMaxima@physikbuch.de>
|
|
// The License.txt file describes the conditions under which this software may be distributed.
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <assert.h>
|
|
#include <ctype.h>
|
|
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
#include "ILexer.h"
|
|
#include "Scintilla.h"
|
|
#include "SciLexer.h"
|
|
|
|
#include "WordList.h"
|
|
#include "LexAccessor.h"
|
|
#include "Accessor.h"
|
|
#include "StyleContext.h"
|
|
#include "CharacterSet.h"
|
|
#include "LexerModule.h"
|
|
using namespace Lexilla;
|
|
|
|
static inline bool isMaximaoperator(char ch) {
|
|
return (ch == '\'' || ch == '`' || ch == '(' ||
|
|
ch == ')' || ch == '[' || ch == ']' ||
|
|
ch == '{' || ch == '}' || ch == '!' ||
|
|
ch == '*' || ch == '/' || ch == '^' ||
|
|
ch == ',' || ch == ':' || ch == '+' ||
|
|
ch == '-');
|
|
}
|
|
|
|
static void ColouriseMaximaDoc(Sci_PositionU startPos, Sci_Position length, int lastStyle,
|
|
WordList *[],
|
|
Accessor &styler) {
|
|
|
|
styler.StartAt(startPos);
|
|
|
|
Sci_PositionU lengthDoc = startPos + length;
|
|
styler.StartSegment(startPos);
|
|
|
|
Sci_PositionU i = startPos;
|
|
|
|
// If we are in the middle of a comment we go back to its start before highlighting
|
|
if(lastStyle == SCE_MAXIMA_COMMENT)
|
|
{
|
|
while((i>0) &&
|
|
!((styler.SafeGetCharAt(i+1) == '*') && (styler.SafeGetCharAt(i) == '/')))
|
|
i--;
|
|
}
|
|
|
|
for (; i < lengthDoc; i++) {
|
|
char ch = styler.SafeGetCharAt(i);
|
|
char chNext = styler.SafeGetCharAt(i + 1);
|
|
|
|
if (styler.IsLeadByte(ch))
|
|
continue;
|
|
|
|
// Handle comments.
|
|
// Comments start with /* and end with */
|
|
if((ch == '/') && (chNext == '*'))
|
|
{
|
|
i++;i++;
|
|
|
|
chNext = styler.SafeGetCharAt(i);
|
|
for (; i < lengthDoc; i++)
|
|
{
|
|
ch = chNext;
|
|
chNext = styler.SafeGetCharAt(i + 1);
|
|
if((ch == '*') && (chNext == '/'))
|
|
{
|
|
i++;
|
|
i++;
|
|
break;
|
|
}
|
|
}
|
|
if(i > lengthDoc)
|
|
i = lengthDoc;
|
|
i--;
|
|
styler.ColourTo(i, SCE_MAXIMA_COMMENT);
|
|
continue;
|
|
}
|
|
|
|
// Handle Operators
|
|
if(isMaximaoperator(ch))
|
|
{
|
|
styler.ColourTo(i, SCE_MAXIMA_OPERATOR);
|
|
continue;
|
|
}
|
|
|
|
// Handle command endings.
|
|
if((ch == '$') || (ch == ';'))
|
|
{
|
|
styler.ColourTo(i, SCE_MAXIMA_COMMANDENDING);
|
|
continue;
|
|
}
|
|
|
|
// Handle numbers. Numbers always begin with a digit.
|
|
if(IsASCII(ch) && isdigit(ch))
|
|
{
|
|
i++;
|
|
for (; i < lengthDoc; i++)
|
|
{
|
|
ch = chNext;
|
|
chNext = styler.SafeGetCharAt(i + 1);
|
|
|
|
if(ch == '.')
|
|
continue;
|
|
|
|
// A "e" or similar can be followed by a "+" or a "-"
|
|
if(((ch == 'e') || (ch == 'b') || (ch == 'g') || (ch == 'f')) &&
|
|
((chNext == '+') || (chNext == '-')))
|
|
{
|
|
i++;
|
|
chNext = styler.SafeGetCharAt(i + 1);
|
|
continue;
|
|
}
|
|
|
|
if(!IsASCII(ch) || !(isdigit(ch) || islower(ch) || isupper(ch)))
|
|
{
|
|
i--;
|
|
break;
|
|
}
|
|
}
|
|
styler.ColourTo(i, SCE_MAXIMA_NUMBER);
|
|
continue;
|
|
}
|
|
|
|
// Handle strings
|
|
if(ch == '\"')
|
|
{
|
|
i++;
|
|
for (; i < lengthDoc; i++)
|
|
{
|
|
ch = chNext;
|
|
chNext = styler.SafeGetCharAt(i + 1);
|
|
if(ch == '\\')
|
|
i++;
|
|
else
|
|
{
|
|
if(ch == '\"')
|
|
break;
|
|
}
|
|
}
|
|
styler.ColourTo(i, SCE_MAXIMA_STRING);
|
|
continue;
|
|
}
|
|
|
|
// Handle keywords. Maxima treats Non-ASCII chars as ordinary letters.
|
|
if(((!IsASCII(ch))) || isalpha(ch) || (ch == '_'))
|
|
{
|
|
char cmd[100];
|
|
int cmdidx = 0;
|
|
memset(cmd,0,100);
|
|
cmd[cmdidx++] = ch;
|
|
i++;
|
|
for (; i < lengthDoc; i++)
|
|
{
|
|
ch = chNext;
|
|
chNext = styler.SafeGetCharAt(i + 1);
|
|
if(ch == '\\')
|
|
{
|
|
if(cmdidx < 99)
|
|
cmd[cmdidx++] = ch;
|
|
i++;
|
|
if(cmdidx < 99)
|
|
cmd[cmdidx++] = ch;
|
|
continue;
|
|
}
|
|
if(isMaximaoperator(ch) || ((IsASCII(ch) && !isalpha(ch) && !isdigit(ch) && (ch != '_'))))
|
|
{
|
|
i--;
|
|
break;
|
|
}
|
|
if(cmdidx < 99)
|
|
cmd[cmdidx++] = ch;
|
|
}
|
|
|
|
// A few known keywords
|
|
if(
|
|
(strncmp(cmd,"if",99) == 0) ||
|
|
(strncmp(cmd,"then",99) == 0) ||
|
|
(strncmp(cmd,"else",99) == 0) ||
|
|
(strncmp(cmd,"thru",99) == 0) ||
|
|
(strncmp(cmd,"for",99) == 0) ||
|
|
(strncmp(cmd,"while",99) == 0) ||
|
|
(strncmp(cmd,"do",99) == 0)
|
|
)
|
|
{
|
|
styler.ColourTo(i, SCE_MAXIMA_COMMAND);
|
|
continue;
|
|
}
|
|
|
|
// All other keywords are functions if they are followed
|
|
// by an opening parenthesis
|
|
char nextNonwhitespace = ' ';
|
|
for (Sci_PositionU o = i + 1; o < lengthDoc; o++)
|
|
{
|
|
nextNonwhitespace = styler.SafeGetCharAt(o);
|
|
if(!IsASCII(nextNonwhitespace) || !isspacechar(nextNonwhitespace))
|
|
break;
|
|
}
|
|
if(nextNonwhitespace == '(')
|
|
{
|
|
styler.ColourTo(i, SCE_MAXIMA_COMMAND);
|
|
}
|
|
else
|
|
{
|
|
styler.ColourTo(i, SCE_MAXIMA_VARIABLE);
|
|
}
|
|
continue;
|
|
}
|
|
|
|
styler.ColourTo(i-1, SCE_MAXIMA_UNKNOWN);
|
|
}
|
|
}
|
|
|
|
extern const LexerModule lmMaxima(SCLEX_MAXIMA, ColouriseMaximaDoc, "maxima", 0, 0);
|