grammarkdown

所属分类:代码编辑器
开发工具:HTML
文件大小:1614KB
下载次数:0
上传日期:2023-01-06 14:46:13
上 传 者sh-1993
说明:  类似于标记的DSL,用于定义编程语言的语法语法。
(Markdown-like DSL for defining grammatical syntax for programming languages.)

文件列表:
.npmignore (124, 2023-06-20)
.travis.yml (91, 2023-06-20)
.vscode (0, 2023-06-20)
.vscode\launch.json (2420, 2023-06-20)
.vscode\settings.json (460, 2023-06-20)
.vscode\tasks.json (604, 2023-06-20)
CONTRIBUTING.md (4354, 2023-06-20)
LICENSE (1093, 2023-06-20)
THIRD_PARTY_NOTICES (9820, 2023-06-20)
api-documenter.json (1136, 2023-06-20)
api-extractor.json (1191, 2023-06-20)
baselines (0, 2023-06-20)
baselines\reference (0, 2023-06-20)
baselines\reference\api-report (0, 2023-06-20)
baselines\reference\api-report\grammarkdown.api.md (101736, 2023-06-20)
baselines\reference\assertions (0, 2023-06-20)
baselines\reference\assertions\constraints (0, 2023-06-20)
baselines\reference\assertions\constraints\basic.grammar.diagnostics (540, 2023-06-20)
baselines\reference\assertions\constraints\basic.grammar.emu.html (384, 2023-06-20)
baselines\reference\assertions\constraints\invalid.grammar.diagnostics (382, 2023-06-20)
baselines\reference\assertions\constraints\invalid.grammar.emu.html (163, 2023-06-20)
baselines\reference\assertions\lookaheadAssertion.grammar.emu.html (282, 2023-06-20)
baselines\reference\assertions\noSymbolHere.grammar.diagnostics (252, 2023-06-20)
baselines\reference\assertions\noSymbolHere.grammar.emu.html (213, 2023-06-20)
baselines\reference\assertions\proseAssertion.2.grammar.emu.html (421, 2023-06-20)
baselines\reference\assertions\proseAssertion.3.grammar.emu.html (985, 2023-06-20)
baselines\reference\assertions\proseAssertion.grammar.emu.html (392, 2023-06-20)
baselines\reference\collapsed (0, 2023-06-20)
baselines\reference\collapsed\multiple.grammar.emu.html (220, 2023-06-20)
baselines\reference\collapsed\multiple.grammar.grammar (20, 2023-06-20)
baselines\reference\collapsed\multiple.grammar.html (481, 2023-06-20)
baselines\reference\collapsed\multiple.grammar.md (156, 2023-06-20)
baselines\reference\collapsed\multiple.grammar.nodes (620, 2023-06-20)
... ...

# grammarkdown [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] ## Summary `grammarkdown` is a markdown-style parser for syntactic grammars, designed to make it easily to rapidly prototype a grammar and statically verify its consistency. The grammar supported by `grammarkdown` is based on the parametric grammar used by ECMA-262 (the JavaScript language standard). ## Usage ``` Syntax: grammarkdown [options] [...files] Examples: grammarkdown es6.grammar grammarkdown --out es6.md --format markdown es6.grammar Options: -f, --format FORMAT The output format. -h, --help Prints this message. --noChecks Does not perform static checking of the grammar. --noEmit Does not emit output. --noEmitOnError Does not emit output if there are errors. -o, --out FILE Specify the output file. -v, --version Prints the version. ``` ## Syntax A `grammarkdown` grammar file uses significant whitespace in the form of line terminators and indentation. Tab (ASCII 0x9) characters are preferred, however using multiple spaces for indentation is supported as long as all nested elements have the same amount of leading whitespace. #### Productions A *Production* consists of a left-hand-side *Nonterminal* followed by a colon (`:`) separator and one or more *right-hand-side* sentences consisting of various forms of *terminal* and *nonterminal* symbols. For example: ``` NameSpaceImport : `*` `as` ImportedBinding ``` It is recommended that *Productions* should follow pascal-case naming conventions, to avoid collision with reserved keywords. You may specify multiple productions for a *Nonterminal* on multiple lines, as follows: ``` NamedImports : `{` `}` NamedImports : `{` ImportList `}` NamedImports : `{` ImportList `,` `}` ``` You may also specify multiple right-hand-side sentences for a single production by indenting them: ``` NamedImports : `{` `}` `{` ImportList `}` `{` ImportList `,` `}` ``` A *Production* may specify one or more *parameters* that can be used to reuse a *Nonterminal* in various circumstances: ``` IdentifierReference[Yield] : Identifier [~Yield] `yield` ``` A *Production* may also specify a limited set of terminals, by using the `one of` keyphrase: ``` Keyword :: one of `break` `do` `in` `typeof` `case` `else` `instanceof` `var` `catch` `export` `new` `void` `class` `extends` `return` `while` `const` `finally` `super` `with` `continue` `for` `switch` `yield` `debugger` `function` `this` `default` `if` `throw` `delete` `import` `try` ``` #### Parameters If a *Nonterminal* on the right-hand-side of a production needs to set a parameter, they supply it in an argument list. Supplying the name of the argument sets the parameter, prefixing the name with a question mark ('?) passes the current value of the parameter, and eliding the argument clears the parameter: ``` Declaration[Yield] : HoistableDeclaration[?Yield] ClassDeclaration[?Yield] LexicalDeclaration[In, ?Yield] ``` The right-hand-side of a *Production* consists of one or more *Terminal* or *Nonterminal* symbols, a sentence of *Prose*, or an *Assertion*. #### Terminals A *Terminal* symbol can be one of the following: * A literal string of one or more characters enclosed in backticks ('\`'). For example: `` `function` `` * A sequence of three backtick characters, which denotes a backtick token. For example: `` ``` `` * A unicode character literal enclosed in a leading less-than ('<') character and a trailing greater-than ('>') character. For example: `` #### Nonterminals A *Nonterminal* symbol is an identifier, followed by an optional argument list, and an optional question mark ('?'). The question mark changes the cardinality of the *Nonterminal* from "exactly one" to "zero or one". The identifier may optionally be enclosed in `|` characters, if it happens to collide with a keyword. #### Character Literals and Ranges Character literals may be specified using one of the following forms: * A Unicode code point, of the form `U+` followed by four to six non-lowercase hexadecimal digits with no leading zeros other than those necessary for padding to a minimum of four digits, in accordance with [The Unicode Standard, Version 15.0.0, Appendix A, Notational Conventions](https://www.unicode.org/versions/Unicode15.0.0/appA.pdf) (i.e., matching Unicode extended BNF pattern `"U+" ( [1-9 A-F] | "10" )? H H H H` or regular expression pattern `^U[+]([1-9A-F]|10)?[0-9A-F]{4}$` as in `U+00A0` or `U+1D306`). * The preceding representation followed by a space and a printable ASCII prose explanation (such as a character name) free of `<` and `>` and line terminators, all wrapped in `<` and `>` (i.e., matching Unicode extended BNF pattern `"<" "U+" ( [1-9 A-F] | "10" )? H H H H " " [\u0020-\u007E -- [<>]]+ ">"` or regular expression pattern `^$` as in ``) * An abbreviation defined somewhere outside the grammar as an ASCII identifier name, wrapped in `<` and `>` (i.e., matching Unicode extended BNF pattern `"<" [A-Z a-z _] [A-Z a-z _ 0-9]* ">"` or regular expression pattern `^<[A-Za-z_][A-Za-z_0-9]*$>` as in ``). Character ranges may be specified using the `through` keyword: ``` SourceCharacter but not one of `"` or `\` or U+0000 through U+001F ``` #### Prose A sentence of *Prose* is a single line with a leading greater-than ('>') character. For example: `> any Unicode code point` #### The `but not` Condition The `but not` condition allows you to reference a production, excluding some part of that production. For example: ``` MultiLineNotAsteriskChar :: SourceCharacter but not `*` ``` Here, *MultiLineNotAsteriskChar* may contain any alternative from *SourceCharacter*, except the terminal `` `*` ``. #### The `one of` Condition You can exclude multiple alternatives by including a list of symbols to exclude through the use of the `one of` keyphrase. Each entry in the list is separated by `or`: ``` MultiLineNotForwardSlashOrAsteriskChar :: SourceCharacter but not one of `/` or `*` ``` #### Assertions An *Assertion* is a zero-width test that must evaluate successfully for the *Production* to be considered. *Assertions* are enclosed in a leading open bracket ('\[') character and a trailing close-bracket ('\]') character. The possible assertions include: * The *empty assertion*, which matches exactly zero tokens: `[empty]` * The *lookahead assertion*, which verifies the next tokens in the stream: ``[lookahead != `function`]`` * The *no-symbol-here assertion*, which verifies the next token is not the provided symbol: `[no LineTerminator here]` * The *lexical-goal assertion*, which states that the current lexical goal is the supplied *Nonterminal*: `[lexical goal InputElementRegExp]` * The *parameter assertion*, which states the supplied parameter to the current production is either set (using the plus ('+') character), or cleared (using the tilde ('~') character): `` [~Yield] `yield` `` * The *prose assertion*, which allows for arbitrary prose, mixed with terminals and nonterminals: ``[> prose text `terminal` prose text |NonTerminal| prose text]`` A *lookahead assertion* has the following operators: * The `==` operator states the lookahead phrase is matched: ``[lookahead == `class`]`` * The `!=` operator states the lookahead phrase is not matched: ``[lookahead != `function`]`` * The `<-` operator states that any matching phrase in the provided set is matched: ``[lookahead <- { `public`, `private` }]`` * The `
近期下载者

相关文件


收藏者