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

Stan: Added missing keywords and HOFs #3238

Merged
merged 3 commits into from Dec 7, 2021
Merged
Show file tree
Hide file tree
Changes from all 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
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>