Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Stan: Added missing keywords and HOFs (#3238)
  • Loading branch information
RunDevelopment committed Dec 7, 2021
1 parent 642d93e commit afd77ed
Show file tree
Hide file tree
Showing 5 changed files with 179 additions and 47 deletions.
104 changes: 60 additions & 44 deletions components/prism-stan.js
@@ -1,49 +1,65 @@
// https://mc-stan.org/docs/2_24/reference-manual/bnf-grammars.html
(function (Prism) {

Prism.languages.stan = {
'comment': /\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,
'string': {
// String literals can contain spaces and any printable ASCII characters except for " and \
// https://mc-stan.org/docs/2_24/reference-manual/print-statements-section.html#string-literals
pattern: /"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,
greedy: true
},
'directive': {
pattern: /^([ \t]*)#include\b.*/m,
lookbehind: true,
alias: 'property'
},
// https://mc-stan.org/docs/2_28/reference-manual/bnf-grammars.html

'function-arg': {
pattern: /(\b(?:algebra_solver|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect)\s*\(\s*)[a-zA-Z]\w*/,
lookbehind: true,
alias: 'function'
},
'constraint': {
pattern: /(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,
lookbehind: true,
inside: {
'expression': {
pattern: /(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,
lookbehind: true,
inside: null // see below
var higherOrderFunctions = /\b(?:algebra_solver|algebra_solver_newton|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect|ode_(?:adams|bdf|ckrk|rk45)(?:_tol)?|ode_adjoint_tol_ctl|reduce_sum|reduce_sum_static)\b/;

Prism.languages.stan = {
'comment': /\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,
'string': {
// String literals can contain spaces and any printable ASCII characters except for " and \
// https://mc-stan.org/docs/2_24/reference-manual/print-statements-section.html#string-literals
pattern: /"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,
greedy: true
},
'directive': {
pattern: /^([ \t]*)#include\b.*/m,
lookbehind: true,
alias: 'property'
},

'function-arg': {
pattern: RegExp(
'(' +
higherOrderFunctions.source +
/\s*\(\s*/.source +
')' +
/[a-zA-Z]\w*/.source
),
lookbehind: true,
alias: 'function'
},
'constraint': {
pattern: /(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,
lookbehind: true,
inside: {
'expression': {
pattern: /(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,
lookbehind: true,
inside: null // see below
},
'property': /\b[a-z]\w*(?=\s*=)/i,
'operator': /=/,
'punctuation': /^<|>$|,/
}
},
'keyword': [
{
pattern: /\bdata(?=\s*\{)|\b(?:functions|generated|model|parameters|quantities|transformed)\b/,
alias: 'program-block'
},
'property': /\b[a-z]\w*(?=\s*=)/i,
'operator': /=/,
'punctuation': /^<|>$|,/
}
},
'keyword': [
/\b(?:break|cholesky_factor_corr|cholesky_factor_cov|continue|corr_matrix|cov_matrix|data|else|for|functions|generated|if|in|increment_log_prob|int|matrix|model|ordered|parameters|positive_ordered|print|quantities|real|reject|return|row_vector|simplex|target|transformed|unit_vector|vector|void|while)\b/,
// these are functions that are known to take another function as their first argument.
/\b(?:algebra_solver|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect)\b/
],
'function': /\b[a-z]\w*(?=\s*\()/i,
'number': /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?\b/i,
'boolean': /\b(?:false|true)\b/,
/\b(?:array|break|cholesky_factor_corr|cholesky_factor_cov|complex|continue|corr_matrix|cov_matrix|data|else|for|if|in|increment_log_prob|int|matrix|ordered|positive_ordered|print|real|reject|return|row_vector|simplex|target|unit_vector|vector|void|while)\b/,
// these are functions that are known to take another function as their first argument.
higherOrderFunctions
],
'function': /\b[a-z]\w*(?=\s*\()/i,
'number': /(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:E[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,
'boolean': /\b(?:false|true)\b/,

'operator': /<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,
'punctuation': /[()\[\]{},;]/
};

'operator': /<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,
'punctuation': /[()\[\]{},;]/
};
Prism.languages.stan.constraint.inside.expression.inside = Prism.languages.stan;

Prism.languages.stan.constraint.inside.expression.inside = Prism.languages.stan;
}(Prism));
2 changes: 1 addition & 1 deletion components/prism-stan.min.js

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

30 changes: 29 additions & 1 deletion tests/languages/stan/keyword_feature.test
@@ -1,6 +1,8 @@
array
break
cholesky_factor_corr
cholesky_factor_cov
complex
continue
corr_matrix
cov_matrix
Expand Down Expand Up @@ -33,18 +35,32 @@ void
while

algebra_solver
algebra_solver_newton
integrate_1d
integrate_ode
integrate_ode_bdf
integrate_ode_rk45
map_rect
ode_adams
ode_adams_tol
ode_adjoint_tol_ctl
ode_bdf
ode_bdf_tol
ode_ckrk
ode_ckrk_tol
ode_rk45
ode_rk45_tol
reduce_sum
reduce_sum_static

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

[
["keyword", "array"],
["keyword", "break"],
["keyword", "cholesky_factor_corr"],
["keyword", "cholesky_factor_cov"],
["keyword", "complex"],
["keyword", "continue"],
["keyword", "corr_matrix"],
["keyword", "cov_matrix"],
Expand Down Expand Up @@ -77,11 +93,23 @@ map_rect
["keyword", "while"],

["keyword", "algebra_solver"],
["keyword", "algebra_solver_newton"],
["keyword", "integrate_1d"],
["keyword", "integrate_ode"],
["keyword", "integrate_ode_bdf"],
["keyword", "integrate_ode_rk45"],
["keyword", "map_rect"]
["keyword", "map_rect"],
["keyword", "ode_adams"],
["keyword", "ode_adams_tol"],
["keyword", "ode_adjoint_tol_ctl"],
["keyword", "ode_bdf"],
["keyword", "ode_bdf_tol"],
["keyword", "ode_ckrk"],
["keyword", "ode_ckrk_tol"],
["keyword", "ode_rk45"],
["keyword", "ode_rk45_tol"],
["keyword", "reduce_sum"],
["keyword", "reduce_sum_static"]
]

----------------------------------------------------
Expand Down
14 changes: 13 additions & 1 deletion tests/languages/stan/number_feature.test
@@ -1,27 +1,39 @@
0
1
24567898765
24_56_78_98_765

0.0
1.0
3.14
2.7e3
2E-5
1.23e+3
3.14i
40e-3i
1e10i
0i
1_2.3_4e5_6i

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

[
["number", "0"],
["number", "1"],
["number", "24567898765"],
["number", "24_56_78_98_765"],

["number", "0.0"],
["number", "1.0"],
["number", "3.14"],
["number", "2.7e3"],
["number", "2E-5"],
["number", "1.23e+3"]
["number", "1.23e+3"],
["number", "3.14i"],
["number", "40e-3i"],
["number", "1e10i"],
["number", "0i"],
["number", "1_2.3_4e5_6i"]
]

----------------------------------------------------
Expand Down
76 changes: 76 additions & 0 deletions tests/languages/stan/program-block_feature.html.test
@@ -0,0 +1,76 @@
functions {
// ... function declarations and definitions ...
}
data {
// ... declarations ...
}
transformed data {
// ... declarations ... statements ...
}
parameters {
// ... declarations ...
}
transformed parameters {
// ... declarations ... statements ...
}
model {
// ... declarations ... statements ...
}
generated quantities {
// ... declarations ... statements ...
}

// data-only quantifiers
real foo(data real x) {
return x^2;
}

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

<span class="token keyword program-block">functions</span>
<span class="token punctuation">{</span>
<span class="token comment">// ... function declarations and definitions ...</span>
<span class="token punctuation">}</span>
<span class="token keyword program-block">data</span>
<span class="token punctuation">{</span>
<span class="token comment">// ... declarations ...</span>
<span class="token punctuation">}</span>
<span class="token keyword program-block">transformed</span>
<span class="token keyword program-block">data</span>
<span class="token punctuation">{</span>
<span class="token comment">// ... declarations ... statements ...</span>
<span class="token punctuation">}</span>
<span class="token keyword program-block">parameters</span>
<span class="token punctuation">{</span>
<span class="token comment">// ... declarations ...</span>
<span class="token punctuation">}</span>
<span class="token keyword program-block">transformed</span>
<span class="token keyword program-block">parameters</span>
<span class="token punctuation">{</span>
<span class="token comment">// ... declarations ... statements ...</span>
<span class="token punctuation">}</span>
<span class="token keyword program-block">model</span>
<span class="token punctuation">{</span>
<span class="token comment">// ... declarations ... statements ...</span>
<span class="token punctuation">}</span>
<span class="token keyword program-block">generated</span>
<span class="token keyword program-block">quantities</span>
<span class="token punctuation">{</span>
<span class="token comment">// ... declarations ... statements ...</span>
<span class="token punctuation">}</span>

<span class="token comment">// data-only quantifiers</span>
<span class="token keyword">real</span>
<span class="token function">foo</span>
<span class="token punctuation">(</span>
<span class="token keyword">data</span>
<span class="token keyword">real</span>
x
<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span>
x
<span class="token operator">^</span>
<span class="token number">2</span>
<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

0 comments on commit afd77ed

Please sign in to comment.