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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 60 additions & 44 deletions components/prism-stan.js
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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>