Skip to content

Commit

Permalink
Add nonterminal syntax
Browse files Browse the repository at this point in the history
Closes #8; closes #11; closes #10.
  • Loading branch information
domenic committed Sep 26, 2014
1 parent 661ec92 commit e32df12
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 2 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,5 @@ Every Ecmarkdown fragment is a **numeric list**. They are written as a series of
**Strings** are written as `"x"` and are translated to `<code>"x"</code>`. (In other words, quoted strings are automatically interpreted as code, with no need to surround them in backticks.) Strings cannot contain double quotes.

**Spec-level constants** are written as `~x~` and are translated to `<emu-const>x</emu-const>`. Spec-level constants cannot contain spaces or tildes.

**Nonterminals** are written as `|x|`, `|x_opt|`, `|x[p]|`, or `|x[p]_opt|`. These are translated, respectively, into `<emu-nt>x</emu-nt>`, `<emu-nt optional>x</emu-nt>`, `<emu-nt params="p">x</emu-nt>`, or `<emu-nt params="p" optional>x</emu-nt>`. Nonterminal names can only be composed of letters. Params can be composed of anything except a closing square bracket.
14 changes: 14 additions & 0 deletions lib/actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,20 @@ exports.specConstant = function (content) {
return $('<emu-const>').text(content);
};

exports.nonterminal = function (name, params, opt) {
var nt = $('<emu-nt>').text(name);

if (params) {
nt.attr('params', params[1]);
}

if (opt) {
nt.attr('optional', '');
}

return nt;
};

exports.dents = function (spaces, state) {
var indentDepths = state.indentDepths;
var depth = spaces.length;
Expand Down
7 changes: 5 additions & 2 deletions lib/beautify.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module.exports = function beautify(html) {
var originalOutput = beautifyWithBugs(html, {
indent_size: 2,
wrap_line_length: 0,
unformatted: ['emu-const', 'emu-val'].concat(inlineElements)
unformatted: ['emu-const', 'emu-val', 'emu-nt'].concat(inlineElements)
});

// https://github.com/beautify-web/js-beautify/issues/524
Expand All @@ -15,5 +15,8 @@ module.exports = function beautify(html) {
// https://github.com/beautify-web/js-beautify/issues/525
var fixExtraSpaces = fixNewlines.replace(/> </g, '> <');

return fixExtraSpaces;
// Remove empty =""s
var withSimplifiedAttributes = fixExtraSpaces.replace(/=""/g, '');

return withSimplifiedAttributes;
};
4 changes: 4 additions & 0 deletions lib/grammar.pegjs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ atom = variable
/ string
/ value
/ specConstant
/ nonterminal
/ normalText

variable = "_" first:variableSegment rest:$("_" variableSegment &"_")* "_" { return actions.variable(first, rest); }
Expand All @@ -28,4 +29,7 @@ value = "*" content:$[^\n* ]+ "*" { ret

specConstant = "~" content:$[^\n~ ]+ "~" { return actions.specConstant(content); }

nonterminal = "|" name:$[a-z]i+ params:("[" $[^\]]+ "]")? opt:"_opt"? "|" { return actions.nonterminal(name,
params, opt); }

normalText = $[^\n]
8 changes: 8 additions & 0 deletions test/cases/nonterminals.ecmarkdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
0. |NonTerminalName|
0. |NonTerminalName_opt|
0. |NonTerminalName[Parameter1]|
0. |NonTerminalName[Parameter1, ?Parameter2]_opt|
0. at end |NonTerminalName[Parameter1, ?Parameter2]_opt|
0. |NonTerminalName[Parameter1, ?Parameter2]_opt| at start
0. in |NonTerminalName[Parameter1, ?Parameter2]_opt| middle
0. invalid |NonTerminalName_opt[Parameter1, ?Parameter2]|
10 changes: 10 additions & 0 deletions test/cases/nonterminals.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<ol>
<li><emu-nt>NonTerminalName</emu-nt></li>
<li><emu-nt optional>NonTerminalName</emu-nt></li>
<li><emu-nt params="Parameter1">NonTerminalName</emu-nt></li>
<li><emu-nt params="Parameter1, ?Parameter2" optional>NonTerminalName</emu-nt></li>
<li>at end <emu-nt params="Parameter1, ?Parameter2" optional>NonTerminalName</emu-nt></li>
<li><emu-nt params="Parameter1, ?Parameter2" optional>NonTerminalName</emu-nt> at start</li>
<li>in <emu-nt params="Parameter1, ?Parameter2" optional>NonTerminalName</emu-nt> middle</li>
<li>invalid |NonTerminalName_opt[Parameter1, ?Parameter2]|</li>
</ol>

0 comments on commit e32df12

Please sign in to comment.