Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F6036731
parserintent.pegjs
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
parserintent.pegjs
View Options
/** PEGjs lexer/parser */
/**
*
* This implements the intent grammar from W3C (as of 15.08.23) from:
* https://www.w3.org/TR/mathml4/#mixing_intent_grammar
*
* intent := concept-or-literal | number | reference | application | structure
* concept-or-literal := NCName
* number := '-'? digit+ ( '.' digit+ )?
* reference := '$' NCName
* structure := ':' ('common' | 'structure' | 'chemistry' | 'equations' )
* application := intent hint? '(' arguments? ')'
* arguments := intent ( ',' intent )*
* hint := '@' ( 'prefix' | 'infix' | 'postfix' | 'function' | 'silent' )
*
* Added 'structure'-macros intents like in W3C Examples to the grammar
* https://github.com/w3c/mathml-docs/blob/main/intent-examples/examples.html
*
* The applications condition is implemented a bit differently, repetitive arguments in parenthesis are
* allowed i.e f(a)(b), this enables checking for applications condition without infinite loop
* warning by PEG interpreter.
*
* Also added hints like "decimal-comma", "thousands-comma" for number
*
* author: Johannes Stegmüller
**/
start = application / intent
intent = concept_or_literal / number / reference / structure
concept_or_literal = NCName {
return $this->text();
}
number = sign:("-"?)
intPart:digits
fracPart:("." digits)?
hint:hint?
{
$intPartS = implode($intPart ?? []);
$fracPartS = implode($fracPart[1] ?? []);
$value = $sign ?? "";
$value .= $intPartS;
$value .= isset($fracPart) ? ("." . $fracPartS ) : "";
return ["type" => "number", "value" => $value, "hint"=>$hint];
}
digits = digit+
digit = [0-9]
reference = "$" NCName {
return substr($this->text(),1);
}
structure = ":" ("common" / "structure" / "chemistry" /"matrix" / "equations" / "chemical-element" / "chemical-formula" / "chemical-equation")
{
return substr($this->text(),1);
}
application = intent:intent hint:hint? args:("(" WS? arguments:arguments? WS? ")")+
{
$argsF = [];
foreach ($args as $arg) {
$argsF[] = $arg[2];
}
$returnObj = [
"type" => "application",
"intent" => $intent,
"hint" => isset($hint) ? $hint : null,
"arguments" => $argsF
];
return $returnObj;
}
arguments = WS? first:start WS? rest:("," WS? start WS?)*
{
$args = [$first];
foreach ($rest as $arg) {
$args[] = $arg[2];
}
return $args;
}
hint = ("@"/":") hintType:("prefix" / "infix" / "postfix" / "function" / "silent" / "decimal-comma" /"thousands-comma")
{
return $hintType;
}
NCName = !":" [a-zA-Z_] [a-zA-Z0-9._-]* { return $this->text(); }
WS = " " {return " "; }
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Oct 4 2026, 19:32 (5 w, 6 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
6f/a5/e8b77e961b5b83e4dda7e8c35b71
Default Alt Text
parserintent.pegjs (2 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment