/g,"\\b(?:(?:col|row)?vector|matrix|scalar)\\b");t.languages.mata={comment:{pattern:/\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,greedy:!0},string:{pattern:/"[^"\r\n]*"|[‘`']".*?"[’`']/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|struct)\s+)\w+(?=\s*(?:\{|\bextends\b))/,lookbehind:!0},type:{pattern:RegExp(e),alias:"class-name",inside:{punctuation:/[()]/,keyword:/\b(?:class|function|struct|void)\b/}},keyword:/\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\b/,constant:/\bNULL\b/,number:{pattern:/(^|[^\w.])(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|\d[a-f0-9]*(?:\.[a-f0-9]+)?x[+-]?\d+)i?(?![\w.])/i,lookbehind:!0},missing:{pattern:/(^|[^\w.])(?:\.[a-z]?)(?![\w.])/,lookbehind:!0,alias:"symbol"},function:/\b[a-z_]\w*(?=\s*\()/i,operator:/\.\.|\+\+|--|&&|\|\||:?(?:[!=<>]=|[+\-*/^<>&|:])|[!?=\\#’`']/,punctuation:/[()[\]{},;.]/}}(Prism);
\ No newline at end of file
diff --git a/components/prism-stata.js b/components/prism-stata.js
new file mode 100644
index 0000000000..a385bfd957
--- /dev/null
+++ b/components/prism-stata.js
@@ -0,0 +1,76 @@
+// https://www.stata.com/manuals/u.pdf
+// https://www.stata.com/manuals/p.pdf
+
+Prism.languages.stata = {
+ 'comment': [
+ {
+ pattern: /(^[ \t]*)\*.*/m,
+ lookbehind: true,
+ greedy: true
+ },
+ {
+ pattern: /(^|\s)\/\/.*|\/\*[\s\S]*?\*\//,
+ lookbehind: true,
+ greedy: true
+ }
+ ],
+ 'string-literal': {
+ pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/,
+ greedy: true,
+ inside: {
+ 'interpolation': {
+ pattern: /\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/,
+ inside: {
+ 'punctuation': /^\$\{|\}$/,
+ 'expression': {
+ pattern: /[\s\S]+/,
+ inside: null // see below
+ }
+ }
+ },
+ 'string': /[\s\S]+/
+ }
+ },
+
+ 'mata': {
+ pattern: /(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m,
+ lookbehind: true,
+ greedy: true,
+ alias: 'language-mata',
+ inside: Prism.languages.mata
+ },
+ 'java': {
+ pattern: /(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m,
+ lookbehind: true,
+ greedy: true,
+ alias: 'language-java',
+ inside: Prism.languages.java
+ },
+ 'python': {
+ pattern: /(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m,
+ lookbehind: true,
+ greedy: true,
+ alias: 'language-python',
+ inside: Prism.languages.python
+ },
+
+
+ 'command': {
+ pattern: /(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m,
+ lookbehind: true,
+ greedy: true,
+ alias: 'keyword'
+ },
+ 'variable': /\$\w+|[‘`']\w[^’`'\r\n]*[’`']/,
+ 'keyword': /\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/,
+
+
+ 'boolean': /\b(?:off|on)\b/,
+ 'number': /\b\d+(?:\.\d+)?\b|\B\.\d+/,
+ 'function': /\b[a-z_]\w*(?=\()/i,
+
+ 'operator': /\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/,
+ 'punctuation': /[(){}[\],:]/
+};
+
+Prism.languages.stata['string-literal'].inside.interpolation.inside.expression.inside = Prism.languages.stata;
diff --git a/components/prism-stata.min.js b/components/prism-stata.min.js
new file mode 100644
index 0000000000..f6ccbfdf20
--- /dev/null
+++ b/components/prism-stata.min.js
@@ -0,0 +1 @@
+Prism.languages.stata={comment:[{pattern:/(^[ \t]*)\*.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|\s)\/\/.*|\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0}],"string-literal":{pattern:/"[^"\r\n]*"|[‘`']".*?"[’`']/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/,inside:{punctuation:/^\$\{|\}$/,expression:{pattern:/[\s\S]+/,inside:null}}},string:/[\s\S]+/}},mata:{pattern:/(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-mata",inside:Prism.languages.mata},java:{pattern:/(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-java",inside:Prism.languages.java},python:{pattern:/(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m,lookbehind:!0,greedy:!0,alias:"language-python",inside:Prism.languages.python},command:{pattern:/(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m,lookbehind:!0,greedy:!0,alias:"keyword"},variable:/\$\w+|[‘`']\w[^’`'\r\n]*[’`']/,keyword:/\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/,boolean:/\b(?:off|on)\b/,number:/\b\d+(?:\.\d+)?\b|\B\.\d+/,function:/\b[a-z_]\w*(?=\()/i,operator:/\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/,punctuation:/[(){}[\],:]/},Prism.languages.stata["string-literal"].inside.interpolation.inside.expression.inside=Prism.languages.stata;
\ No newline at end of file
diff --git a/examples/prism-mata.html b/examples/prism-mata.html
new file mode 100644
index 0000000000..e4d3af9c58
--- /dev/null
+++ b/examples/prism-mata.html
@@ -0,0 +1,9 @@
+Full example
+// Source: https://www.stata.com/manuals/m-1first.pdf page 12
+numeric matrix tanh(numeric matrix u)
+{
+ numeric matrix eu, emu
+ eu = exp(u)
+ emu = exp(-u)
+ return( (eu-emu):/(eu+emu) )
+}
diff --git a/examples/prism-stata.html b/examples/prism-stata.html
new file mode 100644
index 0000000000..eaca66a121
--- /dev/null
+++ b/examples/prism-stata.html
@@ -0,0 +1,13 @@
+Full example
+// Source: https://blog.stata.com/2018/10/09/how-to-automate-common-tasks/
+program normalize
+ version 15.1
+
+ syntax varlist [if] [in] [ , prefix(name) suffix(name) ]
+
+ foreach var in `varlist' {
+ summarize `var' `if' `in'
+ generate `prefix'`var'`suffix' = (`var' - r(mean)) / r(sd) `if' `in'
+ }
+end
+
diff --git a/plugins/autoloader/prism-autoloader.js b/plugins/autoloader/prism-autoloader.js
index c15d2b3d68..c1ec504a69 100644
--- a/plugins/autoloader/prism-autoloader.js
+++ b/plugins/autoloader/prism-autoloader.js
@@ -139,6 +139,11 @@
"sparql": "turtle",
"sqf": "clike",
"squirrel": "clike",
+ "stata": [
+ "mata",
+ "java",
+ "python"
+ ],
"t4-cs": [
"t4-templating",
"csharp"
diff --git a/plugins/autoloader/prism-autoloader.min.js b/plugins/autoloader/prism-autoloader.min.js
index 963efad753..c97a14e100 100644
--- a/plugins/autoloader/prism-autoloader.min.js
+++ b/plugins/autoloader/prism-autoloader.min.js
@@ -1 +1 @@
-!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var c={javascript:"clike",actionscript:"javascript",apex:["clike","sql"],arduino:"cpp",aspnet:["markup","csharp"],birb:"clike",bison:"c",c:"clike",csharp:"clike",cpp:"c",cfscript:"clike",chaiscript:["clike","cpp"],coffeescript:"javascript",crystal:"ruby","css-extras":"css",d:"clike",dart:"clike",django:"markup-templating",ejs:["javascript","markup-templating"],etlua:["lua","markup-templating"],erb:["ruby","markup-templating"],fsharp:"clike","firestore-security-rules":"clike",flow:"javascript",ftl:"markup-templating",gml:"clike",glsl:"c",go:"clike",groovy:"clike",haml:"ruby",handlebars:"markup-templating",haxe:"clike",hlsl:"c",idris:"haskell",java:"clike",javadoc:["markup","java","javadoclike"],jolie:"clike",jsdoc:["javascript","javadoclike","typescript"],"js-extras":"javascript",json5:"json",jsonp:"json","js-templates":"javascript",kotlin:"clike",latte:["clike","markup-templating","php"],less:"css",lilypond:"scheme",liquid:"markup-templating",markdown:"markup","markup-templating":"markup",mongodb:"javascript",n4js:"javascript",objectivec:"c",opencl:"c",parser:"markup",php:"markup-templating",phpdoc:["php","javadoclike"],"php-extras":"php",plsql:"sql",processing:"clike",protobuf:"clike",pug:["markup","javascript"],purebasic:"clike",purescript:"haskell",qsharp:"clike",qml:"javascript",qore:"clike",racket:"scheme",cshtml:["markup","csharp"],jsx:["markup","javascript"],tsx:["jsx","typescript"],reason:"clike",ruby:"clike",sass:"css",scss:"css",scala:"java","shell-session":"bash",smarty:"markup-templating",solidity:"clike",soy:"markup-templating",sparql:"turtle",sqf:"clike",squirrel:"clike","t4-cs":["t4-templating","csharp"],"t4-vb":["t4-templating","vbnet"],tap:"yaml",tt2:["clike","markup-templating"],textile:"markup",twig:"markup-templating",typescript:"javascript",v:"clike",vala:"clike",vbnet:"basic",velocity:"markup",wiki:"markup",xeora:"markup","xml-doc":"markup",xquery:"markup"},n={html:"markup",xml:"markup",svg:"markup",mathml:"markup",ssml:"markup",atom:"markup",rss:"markup",js:"javascript",g4:"antlr4",ino:"arduino","arm-asm":"armasm",adoc:"asciidoc",avs:"avisynth",avdl:"avro-idl",gawk:"awk",shell:"bash",shortcode:"bbcode",rbnf:"bnf",oscript:"bsl",cs:"csharp",dotnet:"csharp",cfc:"cfscript",coffee:"coffeescript",conc:"concurnas",jinja2:"django","dns-zone":"dns-zone-file",dockerfile:"docker",gv:"dot",eta:"ejs",xlsx:"excel-formula",xls:"excel-formula",gamemakerlanguage:"gml",po:"gettext",gni:"gn",ld:"linker-script","go-mod":"go-module",hbs:"handlebars",hs:"haskell",idr:"idris",gitignore:"ignore",hgignore:"ignore",npmignore:"ignore",webmanifest:"json",kt:"kotlin",kts:"kotlin",kum:"kumir",tex:"latex",context:"latex",ly:"lilypond",emacs:"lisp",elisp:"lisp","emacs-lisp":"lisp",md:"markdown",moon:"moonscript",n4jsd:"n4js",nani:"naniscript",objc:"objectivec",qasm:"openqasm",objectpascal:"pascal",px:"pcaxis",pcode:"peoplecode",plantuml:"plant-uml",pq:"powerquery",mscript:"powerquery",pbfasm:"purebasic",purs:"purescript",py:"python",qs:"qsharp",rkt:"racket",razor:"cshtml",rpy:"renpy",robot:"robotframework",rb:"ruby","sh-session":"shell-session",shellsession:"shell-session",smlnj:"sml",sol:"solidity",sln:"solution-file",rq:"sparql",sclang:"supercollider",t4:"t4-cs",trickle:"tremor",troy:"tremor",trig:"turtle",ts:"typescript",tsconfig:"typoscript",uscript:"unrealscript",uc:"unrealscript",url:"uri",vb:"visual-basic",vba:"visual-basic",webidl:"web-idl",mathematica:"wolfram",nb:"wolfram",wl:"wolfram",xeoracube:"xeora",yml:"yaml"},p={},e="components/",a=Prism.util.currentScript();if(a){var r=/\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,s=/(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,i=a.getAttribute("data-autoloader-path");if(null!=i)e=i.trim().replace(/\/?$/,"/");else{var t=a.src;r.test(t)?e=t.replace(r,"components/"):s.test(t)&&(e=t.replace(s,"$1components/"))}}var o=Prism.plugins.autoloader={languages_path:e,use_minified:!0,loadLanguages:u};Prism.hooks.add("complete",function(e){var a=e.element,r=e.language;if(a&&r&&"none"!==r){var s=function(e){var a=(e.getAttribute("data-dependencies")||"").trim();if(!a){var r=e.parentElement;r&&"pre"===r.tagName.toLowerCase()&&(a=(r.getAttribute("data-dependencies")||"").trim())}return a?a.split(/\s*,\s*/g):[]}(a);/^diff-./i.test(r)?(s.push("diff"),s.push(r.substr("diff-".length))):s.push(r),s.every(m)||u(s,function(){Prism.highlightElement(a)})}})}function m(e){if(0<=e.indexOf("!"))return!1;if((e=n[e]||e)in Prism.languages)return!0;var a=p[e];return a&&!a.error&&!1===a.loading}function u(e,a,r){"string"==typeof e&&(e=[e]);var s=e.length,i=0,t=!1;function l(){t||++i===s&&a&&a(e)}0!==s?e.forEach(function(e){!function(a,r,s){var i=0<=a.indexOf("!");function e(){var e=p[a];e||(e=p[a]={callbacks:[]}),e.callbacks.push({success:r,error:s}),!i&&m(a)?k(a,"success"):!i&&e.error?k(a,"error"):!i&&e.loading||(e.loading=!0,e.error=!1,function(e,a,r){var s=document.createElement("script");s.src=e,s.async=!0,s.onload=function(){document.body.removeChild(s),a&&a()},s.onerror=function(){document.body.removeChild(s),r&&r()},document.body.appendChild(s)}(function(e){return o.languages_path+"prism-"+e+(o.use_minified?".min":"")+".js"}(a),function(){e.loading=!1,k(a,"success")},function(){e.loading=!1,e.error=!0,k(a,"error")}))}a=a.replace("!",""),a=n[a]||a;var t=c[a];t&&t.length?u(t,e,s):e()}(e,l,function(){t||(t=!0,r&&r(e))})}):a&&setTimeout(a,0)}function k(e,a){if(p[e]){for(var r=p[e].callbacks,s=0,i=r.length;s= > < <=
+:== :!= :>= :> :< :<=
+
+? :
+=
+#
+
+a’ a` a'
+
+----------------------------------------------------
+
+[
+ ["operator", "+"],
+ ["operator", "-"],
+ ["operator", "*"],
+ ["operator", "/"],
+ ["operator", "^"],
+
+ ["operator", ":+"],
+ ["operator", ":-"],
+ ["operator", ":*"],
+ ["operator", ":/"],
+ ["operator", ":^"],
+
+ ["operator", "++"],
+ ["operator", "--"],
+
+ ["operator", "\\"], ["operator", "::"], ["operator", ".."],
+ ["operator", ":|"], ["operator", "|"], ["operator", ":&"], ["operator", "&"],
+ ["operator", "!"], ["operator", "&&"], ["operator", "||"],
+
+ ["operator", "=="],
+ ["operator", "!="],
+ ["operator", ">="],
+ ["operator", ">"],
+ ["operator", "<"],
+ ["operator", "<="],
+
+ ["operator", ":=="],
+ ["operator", ":!="],
+ ["operator", ":>="],
+ ["operator", ":>"],
+ ["operator", ":<"],
+ ["operator", ":<="],
+
+ ["operator", "?"], ["operator", ":"],
+ ["operator", "="],
+ ["operator", "#"],
+
+ "\r\n\r\na",
+ ["operator", "’"],
+ " a",
+ ["operator", "`"],
+ " a",
+ ["operator", "'"]
+]
diff --git a/tests/languages/mata/punctuation_feature.test b/tests/languages/mata/punctuation_feature.test
new file mode 100644
index 0000000000..f2e9112a20
--- /dev/null
+++ b/tests/languages/mata/punctuation_feature.test
@@ -0,0 +1,20 @@
+( ) [ ] { }
+, ;
+
+t.n1
+
+----------------------------------------------------
+
+[
+ ["punctuation", "("],
+ ["punctuation", ")"],
+ ["punctuation", "["],
+ ["punctuation", "]"],
+ ["punctuation", "{"],
+ ["punctuation", "}"],
+
+ ["punctuation", ","],
+ ["punctuation", ";"],
+
+ "\r\n\r\nt", ["punctuation", "."], "n1"
+]
diff --git a/tests/languages/mata/string_feature.test b/tests/languages/mata/string_feature.test
new file mode 100644
index 0000000000..f728666d2d
--- /dev/null
+++ b/tests/languages/mata/string_feature.test
@@ -0,0 +1,21 @@
+""
+‘""’
+"foo"
+‘"also a string"’
+‘"The "factor" of a matrix"’
+
+// technically not correct, but commonly used on the web
+`"Hamlet said "To be, or not to be.""'
+
+----------------------------------------------------
+
+[
+ ["string", "\"\""],
+ ["string", "‘\"\"’"],
+ ["string", "\"foo\""],
+ ["string", "‘\"also a string\"’"],
+ ["string", "‘\"The \"factor\" of a matrix\"’"],
+
+ ["comment", "// technically not correct, but commonly used on the web"],
+ ["string", "`\"Hamlet said \"To be, or not to be.\"\"'"]
+]
diff --git a/tests/languages/mata/type_feature.test b/tests/languages/mata/type_feature.test
new file mode 100644
index 0000000000..7435d412ef
--- /dev/null
+++ b/tests/languages/mata/type_feature.test
@@ -0,0 +1,102 @@
+void
+transmorphic matrix
+real matrix
+complex matrix
+string matrix
+pointer matrix
+transmorphic rowvector
+real rowvector
+complex rowvector
+string rowvector
+pointer rowvector
+transmorphic colvector
+real colvector
+complex colvector
+string colvector
+pointer colvector
+transmorphic vector
+real vector
+complex vector
+string vector
+pointer vector
+transmorphic scalar
+real scalar
+complex scalar
+string scalar
+pointer scalar
+
+pointer(real matrix) scalar example(real scalar n)
+real scalar neat(pointer(real scalar function) p)
+struct mystruct scalar y
+class rotated_coord scalar b
+
+----------------------------------------------------
+
+[
+ ["type", [
+ ["keyword", "void"]
+ ]],
+ ["type", ["transmorphic matrix"]],
+ ["type", ["real matrix"]],
+ ["type", ["complex matrix"]],
+ ["type", ["string matrix"]],
+ ["type", ["pointer matrix"]],
+ ["type", ["transmorphic rowvector"]],
+ ["type", ["real rowvector"]],
+ ["type", ["complex rowvector"]],
+ ["type", ["string rowvector"]],
+ ["type", ["pointer rowvector"]],
+ ["type", ["transmorphic colvector"]],
+ ["type", ["real colvector"]],
+ ["type", ["complex colvector"]],
+ ["type", ["string colvector"]],
+ ["type", ["pointer colvector"]],
+ ["type", ["transmorphic vector"]],
+ ["type", ["real vector"]],
+ ["type", ["complex vector"]],
+ ["type", ["string vector"]],
+ ["type", ["pointer vector"]],
+ ["type", ["transmorphic scalar"]],
+ ["type", ["real scalar"]],
+ ["type", ["complex scalar"]],
+ ["type", ["string scalar"]],
+ ["type", ["pointer scalar"]],
+
+ ["type", [
+ "pointer",
+ ["punctuation", "("],
+ "real matrix",
+ ["punctuation", ")"],
+ " scalar"
+ ]],
+ ["function", "example"],
+ ["punctuation", "("],
+ ["type", ["real scalar"]],
+ " n",
+ ["punctuation", ")"],
+
+ ["type", ["real scalar"]],
+ ["function", "neat"],
+ ["punctuation", "("],
+ ["type", [
+ "pointer",
+ ["punctuation", "("],
+ "real scalar ",
+ ["keyword", "function"],
+ ["punctuation", ")"]
+ ]],
+ " p",
+ ["punctuation", ")"],
+
+ ["type", [
+ ["keyword", "struct"],
+ " mystruct scalar"
+ ]],
+ " y\r\n",
+
+ ["type", [
+ ["keyword", "class"],
+ " rotated_coord scalar"
+ ]],
+ " b"
+]
diff --git a/tests/languages/stata/boolean_feature.test b/tests/languages/stata/boolean_feature.test
new file mode 100644
index 0000000000..885cac77d1
--- /dev/null
+++ b/tests/languages/stata/boolean_feature.test
@@ -0,0 +1,9 @@
+set foo on
+set foo off
+
+----------------------------------------------------
+
+[
+ ["command", "set"], " foo ", ["boolean", "on"],
+ ["command", "set"], " foo ", ["boolean", "off"]
+]
diff --git a/tests/languages/stata/command_feature.test b/tests/languages/stata/command_feature.test
new file mode 100644
index 0000000000..e1be94d829
--- /dev/null
+++ b/tests/languages/stata/command_feature.test
@@ -0,0 +1,9 @@
+quietly regress foo
+quietly: regress foo
+
+----------------------------------------------------
+
+[
+ ["keyword", "quietly"], ["command", "regress"], " foo\r\n",
+ ["keyword", "quietly"], ["punctuation", ":"], ["command", "regress"], " foo"
+]
diff --git a/tests/languages/stata/comment_feature.test b/tests/languages/stata/comment_feature.test
new file mode 100644
index 0000000000..aa90d4bd79
--- /dev/null
+++ b/tests/languages/stata/comment_feature.test
@@ -0,0 +1,49 @@
+* comment
+// comment
+/*
+comment
+*/
+
+* a sample analysis job
+version 17.0
+use census
+/* obtain the summary statistics */
+tabulate region // there are 4 regions in this dataset
+summarize marriage
+* a sample analysis job
+version 17.0
+use /* obtain the summary statistics */ census
+tabulate region
+// there are 4 regions in this dataset
+summarize marriage
+
+----------------------------------------------------
+
+[
+ ["comment", "* comment"],
+ ["comment", "// comment"],
+ ["comment", "/*\r\ncomment\r\n*/"],
+
+ ["comment", "* a sample analysis job"],
+ ["command", "version"],
+ ["number", "17.0"],
+ ["command", "use"],
+ " census\r\n",
+ ["comment", "/* obtain the summary statistics */"],
+ ["command", "tabulate"],
+ " region ",
+ ["comment", "// there are 4 regions in this dataset"],
+ ["command", "summarize"],
+ " marriage\r\n",
+ ["comment", "* a sample analysis job"],
+ ["command", "version"],
+ ["number", "17.0"],
+ ["command", "use"],
+ ["comment", "/* obtain the summary statistics */"],
+ " census\r\n",
+ ["command", "tabulate"],
+ " region\r\n",
+ ["comment", "// there are 4 regions in this dataset"],
+ ["command", "summarize"],
+ " marriage"
+]
diff --git a/tests/languages/stata/java_inclusion.test b/tests/languages/stata/java_inclusion.test
new file mode 100644
index 0000000000..f68244947a
--- /dev/null
+++ b/tests/languages/stata/java_inclusion.test
@@ -0,0 +1,61 @@
+program java_program
+ version 17
+ java: printX();
+end
+java:
+ int x = 123;
+ void printX() {
+ System.out.println("x: " + x);
+ }
+end
+
+----------------------------------------------------
+
+[
+ ["command", "program"],
+ " java_program\r\n\t",
+
+ ["command", "version"],
+ ["number", "17"],
+
+ ["command", "java"],
+ ["punctuation", ":"],
+ ["java", [
+ ["function", "printX"],
+ ["punctuation", "("],
+ ["punctuation", ")"],
+ ["punctuation", ";"]
+ ]],
+ ["command", "end"],
+
+ ["command", "java"],
+ ["punctuation", ":"],
+ ["java", [
+ ["keyword", "int"],
+ " x ",
+ ["operator", "="],
+ ["number", "123"],
+ ["punctuation", ";"],
+
+ ["keyword", "void"],
+ ["function", "printX"],
+ ["punctuation", "("],
+ ["punctuation", ")"],
+ ["punctuation", "{"],
+
+ ["class-name", ["System"]],
+ ["punctuation", "."],
+ "out",
+ ["punctuation", "."],
+ ["function", "println"],
+ ["punctuation", "("],
+ ["string", "\"x: \""],
+ ["operator", "+"],
+ " x",
+ ["punctuation", ")"],
+ ["punctuation", ";"],
+
+ ["punctuation", "}"]
+ ]],
+ ["command", "end"]
+]
diff --git a/tests/languages/stata/keyword_feature.test b/tests/languages/stata/keyword_feature.test
new file mode 100644
index 0000000000..aefcfa464e
--- /dev/null
+++ b/tests/languages/stata/keyword_feature.test
@@ -0,0 +1,63 @@
+foo bayes
+foo bootstrap
+foo by
+foo bysort
+foo capture
+foo clear
+foo collect
+foo fmm
+foo fp
+foo frame
+foo if
+foo in
+foo jackknife
+foo mfp
+foo mi estimate
+foo nestreg
+foo noisily
+foo of
+foo permute
+foo quietly
+foo rolling
+foo simulate
+foo sort
+foo statsby
+foo stepwise
+foo svy
+foo varlist
+foo version
+foo xi
+
+----------------------------------------------------
+
+[
+ ["command", "foo"], ["keyword", "bayes"],
+ ["command", "foo"], ["keyword", "bootstrap"],
+ ["command", "foo"], ["keyword", "by"],
+ ["command", "foo"], ["keyword", "bysort"],
+ ["command", "foo"], ["keyword", "capture"],
+ ["command", "foo"], ["keyword", "clear"],
+ ["command", "foo"], ["keyword", "collect"],
+ ["command", "foo"], ["keyword", "fmm"],
+ ["command", "foo"], ["keyword", "fp"],
+ ["command", "foo"], ["keyword", "frame"],
+ ["command", "foo"], ["keyword", "if"],
+ ["command", "foo"], ["keyword", "in"],
+ ["command", "foo"], ["keyword", "jackknife"],
+ ["command", "foo"], ["keyword", "mfp"],
+ ["command", "foo"], ["keyword", "mi estimate"],
+ ["command", "foo"], ["keyword", "nestreg"],
+ ["command", "foo"], ["keyword", "noisily"],
+ ["command", "foo"], ["keyword", "of"],
+ ["command", "foo"], ["keyword", "permute"],
+ ["command", "foo"], ["keyword", "quietly"],
+ ["command", "foo"], ["keyword", "rolling"],
+ ["command", "foo"], ["keyword", "simulate"],
+ ["command", "foo"], ["keyword", "sort"],
+ ["command", "foo"], ["keyword", "statsby"],
+ ["command", "foo"], ["keyword", "stepwise"],
+ ["command", "foo"], ["keyword", "svy"],
+ ["command", "foo"], ["keyword", "varlist"],
+ ["command", "foo"], ["keyword", "version"],
+ ["command", "foo"], ["keyword", "xi"]
+]
diff --git a/tests/languages/stata/mata_inclusion.test b/tests/languages/stata/mata_inclusion.test
new file mode 100644
index 0000000000..095a404817
--- /dev/null
+++ b/tests/languages/stata/mata_inclusion.test
@@ -0,0 +1,84 @@
+version 17.0
+include limits.matah
+mata:
+real matrix inpivot(real matrix X)
+{
+ real matrix y1, yz
+ real scalar n
+ if (rows(X)>‘MAXDIM’ | cols(X)>‘MAXDIM’) {
+ errprintf("inpivot: matrix too large\n")
+ exit(1000)
+ }
+ ...
+}
+end
+
+----------------------------------------------------
+
+[
+ ["command", "version"],
+ ["number", "17.0"],
+
+ ["command", "include"],
+ " limits.matah\r\n",
+
+ ["command", "mata"],
+ ["punctuation", ":"],
+
+ ["mata", [
+ ["type", ["real matrix"]],
+ ["function", "inpivot"],
+ ["punctuation", "("],
+ ["type", ["real matrix"]],
+ " X",
+ ["punctuation", ")"],
+
+ ["punctuation", "{"],
+
+ ["type", ["real matrix"]],
+ " y1",
+ ["punctuation", ","],
+ " yz\r\n\t",
+
+ ["type", ["real scalar"]],
+ " n\r\n\t",
+
+ ["keyword", "if"],
+ ["punctuation", "("],
+ ["function", "rows"],
+ ["punctuation", "("],
+ "X",
+ ["punctuation", ")"],
+ ["operator", ">"],
+ "‘MAXDIM",
+ ["operator", "’"],
+ ["operator", "|"],
+ ["function", "cols"],
+ ["punctuation", "("],
+ "X",
+ ["punctuation", ")"],
+ ["operator", ">"],
+ "‘MAXDIM",
+ ["operator", "’"],
+ ["punctuation", ")"],
+ ["punctuation", "{"],
+
+ ["function", "errprintf"],
+ ["punctuation", "("],
+ ["string", "\"inpivot: matrix too large\\n\""],
+ ["punctuation", ")"],
+
+ ["function", "exit"],
+ ["punctuation", "("],
+ ["number", "1000"],
+ ["punctuation", ")"],
+
+ ["punctuation", "}"],
+
+ ["operator", ".."],
+ ["punctuation", "."],
+
+ ["punctuation", "}"]
+ ]],
+ ["command", "end"]
+]
diff --git a/tests/languages/stata/number_feature.test b/tests/languages/stata/number_feature.test
new file mode 100644
index 0000000000..666a572364
--- /dev/null
+++ b/tests/languages/stata/number_feature.test
@@ -0,0 +1,11 @@
+123
+123.456
+.123
+
+----------------------------------------------------
+
+[
+ ["number", "123"],
+ ["number", "123.456"],
+ ["number", ".123"]
+]
diff --git a/tests/languages/stata/operator_feature.test b/tests/languages/stata/operator_feature.test
new file mode 100644
index 0000000000..73ef78a661
--- /dev/null
+++ b/tests/languages/stata/operator_feature.test
@@ -0,0 +1,36 @@
++ - * / ^
+++ --
+
+< <= > >= == != ~=
+=
+
+& | ! ~
+
+# ##
+
+----------------------------------------------------
+
+[
+ ["operator", "+"],
+ ["operator", "-"],
+ ["operator", "*"],
+ ["operator", "/"],
+ ["operator", "^"],
+
+ ["operator", "++"],
+ ["operator", "--"],
+
+ ["operator", "<"],
+ ["operator", "<="],
+ ["operator", ">"],
+ ["operator", ">="],
+ ["operator", "=="],
+ ["operator", "!="],
+ ["operator", "~="],
+
+ ["operator", "="],
+
+ ["operator", "&"], ["operator", "|"], ["operator", "!"], ["operator", "~"],
+
+ ["operator", "#"], ["operator", "##"]
+]
diff --git a/tests/languages/stata/python_inclusion.test b/tests/languages/stata/python_inclusion.test
new file mode 100644
index 0000000000..8fa8b2110a
--- /dev/null
+++ b/tests/languages/stata/python_inclusion.test
@@ -0,0 +1,70 @@
+version 17.0
+local a = 2
+local b = 3
+python:
+from sfi import Scalar
+def calcsum(num1, num2):
+ res = num1 + num2
+ Scalar.setValue("result", res)
+calcsum(‘a’, ‘b’)
+end
+display result
+
+----------------------------------------------------
+
+[
+ ["command", "version"],
+ ["number", "17.0"],
+
+ ["command", "local"],
+ " a ",
+ ["operator", "="],
+ ["number", "2"],
+
+ ["command", "local"],
+ " b ",
+ ["operator", "="],
+ ["number", "3"],
+
+ ["command", "python"],
+ ["punctuation", ":"],
+ ["python", [
+ ["keyword", "from"],
+ " sfi ",
+ ["keyword", "import"],
+ " Scalar\r\n",
+
+ ["keyword", "def"],
+ ["function", "calcsum"],
+ ["punctuation", "("],
+ "num1",
+ ["punctuation", ","],
+ " num2",
+ ["punctuation", ")"],
+ ["punctuation", ":"],
+
+ "\r\n\tres ",
+ ["operator", "="],
+ " num1 ",
+ ["operator", "+"],
+ " num2\r\n\tScalar",
+ ["punctuation", "."],
+ "setValue",
+ ["punctuation", "("],
+ ["string", "\"result\""],
+ ["punctuation", ","],
+ " res",
+ ["punctuation", ")"],
+
+ "\r\ncalcsum",
+ ["punctuation", "("],
+ "‘a’",
+ ["punctuation", ","],
+ " ‘b’",
+ ["punctuation", ")"]
+ ]],
+ ["command", "end"],
+
+ ["command", "display"],
+ " result"
+]
diff --git a/tests/languages/stata/string_feature.test b/tests/languages/stata/string_feature.test
new file mode 100644
index 0000000000..c8647a4e52
--- /dev/null
+++ b/tests/languages/stata/string_feature.test
@@ -0,0 +1,51 @@
+""
+"foo"
+"${datadir}householdmembers"
+"‘ins’"
+"‘mpg[one]’"
+
+`"ysc(r(0 80)) xtitle("Health Status", size(medlarge))"'
+
+----------------------------------------------------
+
+[
+ ["string-literal", [
+ ["string", "\"\""]
+ ]],
+ ["string-literal", [
+ ["string", "\"foo\""]
+ ]],
+ ["string-literal", [
+ ["string", "\""],
+ ["interpolation", [
+ ["punctuation", "${"],
+ ["expression", [
+ ["command", "datadir"]
+ ]],
+ ["punctuation", "}"]
+ ]],
+ ["string", "householdmembers\""]
+ ]],
+ ["string-literal", [
+ ["string", "\""],
+ ["interpolation", [
+ ["expression", [
+ ["variable", "‘ins’"]
+ ]]
+ ]],
+ ["string", "\""]
+ ]],
+ ["string-literal", [
+ ["string", "\""],
+ ["interpolation", [
+ ["expression", [
+ ["variable", "‘mpg[one]’"]
+ ]]
+ ]],
+ ["string", "\""]
+ ]],
+
+ ["string-literal", [
+ ["string", "`\"ysc(r(0 80)) xtitle(\"Health Status\", size(medlarge))\"'"]
+ ]]
+]
diff --git a/tests/languages/stata/variable_feature.test b/tests/languages/stata/variable_feature.test
new file mode 100644
index 0000000000..8bdbe09d86
--- /dev/null
+++ b/tests/languages/stata/variable_feature.test
@@ -0,0 +1,7 @@
+$histoption
+
+----------------------------------------------------
+
+[
+ ["variable", "$histoption"]
+]