Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PureBasic #2369

Merged
merged 9 commits into from May 6, 2020
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions components.json
Expand Up @@ -848,6 +848,12 @@
],
"owner": "Golmote"
},
"purebasic": {
"title": "PureBasic",
"require": "clike",
"alias": "pbfasm",
"owner": "HeX0R101"
},
"python": {
"title": "Python",
"alias": "py",
Expand Down
85 changes: 85 additions & 0 deletions components/prism-purebasic.js
@@ -0,0 +1,85 @@
/*
Original Code by Bas Groothedde
!!MANY THANKS!! I never would have made this, regex and me will never be best friends ;)
==> https://codepen.io/ImagineProgramming/details/JYydBy/
slightly changed to pass all tests
*/


Prism.languages.pbfasm = {
'comment': /;.*$/m,
'string': /("|'|`)(?:\\?.)*?\1/m,
'function': {
pattern: /^(?:(\s*\!\s*))[0-9a-zA-Z]+(?=\s|$)/im,
lookbehind: true
},
'function-inline': {
pattern: /(?:(\s*\:\s*))[0-9a-zA-Z]+(?=\s)/im,
lookbehind: true,
alias: 'function'
},
'label': {
pattern: /^(?:(\s*\!\s*))[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,
lookbehind: true,
alias: 'fasm-label'
},
'keyword': [
/(?:extern|extern|global)[^;\r\n]*/im,
/(?:CPU|FLOAT|DEFAULT).*$/m
],
'register': {
pattern: /\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|sp|si|di)|[cdefgs]s|mm[0-9]+)\b/i
},
'number': /(?:\b|-|(?=\$))(?:0[hx][\da-f]*\.?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|\d*\.?\d+(?:\.?e[+-]?\d+)?[dt]?)\b/i,
'operator': /[\[\]*+\-\/%<>=&|$!\,\.:]/
};

// Named label reference, i.e.: jne label1
Prism.languages.insertBefore('pbfasm', 'function', {
'label-reference-addressed': {
pattern: /(?:(\s*\!\s*j[a-zA-Z]+\s+))(?:[A-Za-z._?$@][\w.?$@~#]*)/mi,
lookbehind: true,
alias: 'fasm-label'
}
});

// Anonymous label references, i.e.: jmp @b
Prism.languages.insertBefore('pbfasm', 'label-reference-addressed', {
'label-reference-anonymous': {
pattern: /(?:(\s*\!\s*j[a-zA-Z]+\s+))(?:\@[fb]{1})/mi,
lookbehind: true,
alias: 'fasm-label'
}
});

// PureBasic support, steal stuff from ansi-c
Prism.languages.purebasic = Prism.languages.extend('clike', {
'important': /\*(?:[a-zA-Z0-9_]+)\b/i,
'number': /(?:\$[0-9a-f]+|\b-?\d*\.?\d+(?:e[+-]?\d+)?)\b/i,
'operator': /\@\*[0-9a-zA-Z_]+|(?:\@|\?)[0-9a-zA-Z_]+|\*[0-9a-zA-Z_]+|\-[>-]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|?\||[~^%?*\/]|\@/,
'function': {
pattern: /\b(?:[a-z0-9_]+)(?:\.[a-z0-9_]+)?\s*(?=\()/i
},
'comment': /(?:\;.*)/i
});

Prism.languages.insertBefore('purebasic', 'function', {
'keyword': {
pattern: /\b(?:declarecdll|declaredll|compilerselect|compilercase|compilerdefault|compilerendselect|compilererror|enableexplicit|disableexplicit|not|and|or|xor|calldebugger|debuglevel|enabledebugger|disabledebugger|restore|read|includepath|includebinary|threaded|runtime|with|endwith|structureunion|endstructureunion|align|newlist|newmap|interface|endinterface|extends|enumeration|endenumeration|swap|foreach|continue|fakereturn|goto|gosub|return|break|module|endmodule|declaremodule|enddeclaremodule|declare|declarec|prototype|prototypec|enableasm|disableasm|dim|redim|data|datasection|enddatasection|to|procedurereturn|debug|default|case|select|endselect|as|import|endimport|importc|compilerif|compilerelse|compilerendif|compilerelseif|end|structure|endstructure|while|wend|for|next|step|if|else|elseif|endif|repeat|until|procedure|proceduredll|procedurec|procedurecdll|endprocedure|protected|shared|static|global|define|includefile|xincludefile|macro|endmacro)\b/i
}
});

Prism.languages.insertBefore('purebasic', 'keyword', {
'tag': /(?:\#[a-zA-Z0-9_]+)/,
'asm': {
pattern: /(^\s*)(?:\!.*)/im,
lookbehind: true,
inside: Prism.languages.pbfasm,
alias: 'tag'
}
});

Prism.languages.pbfasm = Prism.languages['purebasic'];
RunDevelopment marked this conversation as resolved.
Show resolved Hide resolved
delete Prism.languages.purebasic['class-name'];
delete Prism.languages.purebasic['boolean'];

1 change: 1 addition & 0 deletions components/prism-purebasic.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions examples/prism-purebasic.html
@@ -0,0 +1,30 @@
<p>Note: PureBasic Examples.</p>

<h2>Comments</h2>
<pre><code>; This is a comment</code></pre>

<h2>Strings</h2>
<pre><code>"This a string."</code></pre>

<h2>Numbers</h2>
<pre><code>42
3.14159
-42
-3.14159
.5
10.
2E10
4.2E-14
-3E+2</code></pre>

<h2>PureBasic example</h2>
<pre><code>Procedure.s Test(s.s)
Protected a$, b$, Result.s

Result = Mid(s, 1, 3)

ProcedureReturn Result
EndProcedure

Test()
End</code></pre>
13 changes: 13 additions & 0 deletions tests/languages/purebasic/comment_feature.test
@@ -0,0 +1,13 @@
;
;gugug du Affe
HeX0R101 marked this conversation as resolved.
Show resolved Hide resolved

----------------------------------------------------

[
["comment", ";"],
["comment", ";gugug du Affe"]
]

----------------------------------------------------

Checks for comments.
211 changes: 211 additions & 0 deletions tests/languages/purebasic/function_feature.test
@@ -0,0 +1,211 @@
DECLARECDLL
DECLAREDLL
COMPILERSELECT
COMPILERCASE
COMPILERDEFAULT
COMPILERENDSELECT
COMPILERERROR
ENABLEEXPLICIT
DISABLEEXPLICIT
NOT
AND
OR
XOR
CALLDEBUGGER
DEBUGLEVEL
ENABLEDEBUGGER
DISABLEDEBUGGER
RESTORE
READ
INCLUDEPATH
INCLUDEBINARY
THREADED
RUNTIME
WITH
ENDWITH
STRUCTUREUNION
ENDSTRUCTUREUNION
ALIGN
NEWLIST
NEWMAP
INTERFACE
ENDINTERFACE
EXTENDS
ENUMERATION
ENDENUMERATION
SWAP
FOREACH
CONTINUE
FAKERETURN
GOTO
GOSUB
RETURN
BREAK
MODULE
ENDMODULE
DECLAREMODULE
ENDDECLAREMODULE
DECLARE
DECLAREC
PROTOTYPE
PROTOTYPEC
ENABLEASM
DISABLEASM
DIM
REDIM
DATA
DATASECTION
ENDDATASECTION
TO
PROCEDURERETURN
DEBUG
DEFAULT
CASE
SELECT
ENDSELECT
AS
IMPORT
ENDIMPORT
IMPORTC
COMPILERIF
COMPILERELSE
COMPILERENDIF
COMPILERELSEIF
END
STRUCTURE
ENDSTRUCTURE
WHILE
WEND
FOR
NEXT
STEP
IF
ELSE
ELSEIF
ENDIF
REPEAT
UNTIL
PROCEDURE
PROCEDUREDLL
PROCEDUREC
PROCEDURECDLL
ENDPROCEDURE
PROTECTED
SHARED
STATIC
GLOBAL
DEFINE
INCLUDEFILE
XINCLUDEFILE
MACRO
ENDMACRO

----------------------------------------------------

[
["keyword", "DECLARECDLL"],
["keyword", "DECLAREDLL"],
["keyword", "COMPILERSELECT"],
["keyword", "COMPILERCASE"],
["keyword", "COMPILERDEFAULT"],
["keyword", "COMPILERENDSELECT"],
["keyword", "COMPILERERROR"],
["keyword", "ENABLEEXPLICIT"],
["keyword", "DISABLEEXPLICIT"],
["keyword", "NOT"],
["keyword", "AND"],
["keyword", "OR"],
["keyword", "XOR"],
["keyword", "CALLDEBUGGER"],
["keyword", "DEBUGLEVEL"],
["keyword", "ENABLEDEBUGGER"],
["keyword", "DISABLEDEBUGGER"],
["keyword", "RESTORE"],
["keyword", "READ"],
["keyword", "INCLUDEPATH"],
["keyword", "INCLUDEBINARY"],
["keyword", "THREADED"],
["keyword", "RUNTIME"],
["keyword", "WITH"],
["keyword", "ENDWITH"],
["keyword", "STRUCTUREUNION"],
["keyword", "ENDSTRUCTUREUNION"],
["keyword", "ALIGN"],
["keyword", "NEWLIST"],
["keyword", "NEWMAP"],
["keyword", "INTERFACE"],
["keyword", "ENDINTERFACE"],
["keyword", "EXTENDS"],
["keyword", "ENUMERATION"],
["keyword", "ENDENUMERATION"],
["keyword", "SWAP"],
["keyword", "FOREACH"],
["keyword", "CONTINUE"],
["keyword", "FAKERETURN"],
["keyword", "GOTO"],
["keyword", "GOSUB"],
["keyword", "RETURN"],
["keyword", "BREAK"],
["keyword", "MODULE"],
["keyword", "ENDMODULE"],
["keyword", "DECLAREMODULE"],
["keyword", "ENDDECLAREMODULE"],
["keyword", "DECLARE"],
["keyword", "DECLAREC"],
["keyword", "PROTOTYPE"],
["keyword", "PROTOTYPEC"],
["keyword", "ENABLEASM"],
["keyword", "DISABLEASM"],
["keyword", "DIM"],
["keyword", "REDIM"],
["keyword", "DATA"],
["keyword", "DATASECTION"],
["keyword", "ENDDATASECTION"],
["keyword", "TO"],
["keyword", "PROCEDURERETURN"],
["keyword", "DEBUG"],
["keyword", "DEFAULT"],
["keyword", "CASE"],
["keyword", "SELECT"],
["keyword", "ENDSELECT"],
["keyword", "AS"],
["keyword", "IMPORT"],
["keyword", "ENDIMPORT"],
["keyword", "IMPORTC"],
["keyword", "COMPILERIF"],
["keyword", "COMPILERELSE"],
["keyword", "COMPILERENDIF"],
["keyword", "COMPILERELSEIF"],
["keyword", "END"],
["keyword", "STRUCTURE"],
["keyword", "ENDSTRUCTURE"],
["keyword", "WHILE"],
["keyword", "WEND"],
["keyword", "FOR"],
["keyword", "NEXT"],
["keyword", "STEP"],
["keyword", "IF"],
["keyword", "ELSE"],
["keyword", "ELSEIF"],
["keyword", "ENDIF"],
["keyword", "REPEAT"],
["keyword", "UNTIL"],
["keyword", "PROCEDURE"],
["keyword", "PROCEDUREDLL"],
["keyword", "PROCEDUREC"],
["keyword", "PROCEDURECDLL"],
["keyword", "ENDPROCEDURE"],
["keyword", "PROTECTED"],
["keyword", "SHARED"],
["keyword", "STATIC"],
["keyword", "GLOBAL"],
["keyword", "DEFINE"],
["keyword", "INCLUDEFILE"],
["keyword", "XINCLUDEFILE"],
["keyword", "MACRO"],
["keyword", "ENDMACRO"]
]

----------------------------------------------------

Checks for keywords.
19 changes: 19 additions & 0 deletions tests/languages/purebasic/number_feature.test
@@ -0,0 +1,19 @@
42
3.14159
2e8
3.4E-9
0.7E+12

----------------------------------------------------

[
["number", "42"],
["number", "3.14159"],
["number", "2e8"],
["number", "3.4E-9"],
["number", "0.7E+12"]
]

----------------------------------------------------

Checks for numbers.
15 changes: 15 additions & 0 deletions tests/languages/purebasic/operator_feature.test
@@ -0,0 +1,15 @@
< <=
> >=
+ - *

----------------------------------------------------

[
["operator", "<"], ["operator", "<="],
["operator", ">"], ["operator", ">="],
["operator", "+"], ["operator", "-"], ["operator", "*"]
]

----------------------------------------------------

Checks for operators.