README
@vnhtml/parser
A module which takes raw statements from @vnhtml/lexer and converts them into a hierarchical abstract syntax tree.
Example
var lexer = require("@vnhtml/lexer")
var parser = require("@vnhtml/parser")
var parserState = parser.create(
"A context for the parsing",
function onError(context, line, message) {
console.log(
"Error; context " + JSON.stringify(context)
+ ", line " + line
+ ", message " + JSON.stringify(message)
)
},
function onEndOfFile(context, parsed) {
console.log("End of file; context " + JSON.stringify(context) + ", collected:")
console.log(JSON.stringify(parsed, null, 2))
}
)
var lexerState = lexer.create(parserState, parser.line, parser.indent, parser.outdent, nop, parser.endOfFile)
lexer.text(lexerState, `TODO`)
lexer.endOfFile(lexerState)
function nop() {}
Output
TODO
Exception handling
Should any callback throw an exception, further calls to line
, indent
,
outdent
, error
and endOfFile
will be rejected for that parser state.
statements
Examples of Any statement which waits for user input (lines, menus) will include a V4 UUID called "promptId".
Line
vnhtml
Jeff Jake and Phil:
We're speaking in unison to bring you the good news!
You can include any number of lines of dialog like this,
and they'll be put together into a single statement.
Statements
[{
"line": {
"promptId": "48363e91-0a73-476b-884a-241cb57387c0",
"characters": ["Jeff", "Jake", "Phil"],
"text": "We're speaking in unison to bring you the good news!\nYou can include any number of lines of dialog like this,\nand they'll be put together into a single statement."
}
}]
Line with emote
vnhtml
Jeff Jake and Phil (otherworldly):
We're speaking in unison to bring you the good news!
You can include any number of lines of dialog like this,
and they'll be put together into a single statement.
Statements
[{
"emote": {
"character": "Jeff",
"emote": "otherworldly"
}
}, {
"emote": {
"character": "Jake",
"emote": "otherworldly"
}
}, {
"emote": {
"character": "Phil",
"emote": "otherworldly"
}
}, {
"line": {
"promptId": "48363e91-0a73-476b-884a-241cb57387c0",
"characters": ["Jeff", "Jake", "Phil"],
"text": "We're speaking in unison to bring you the good news!\nYou can include any number of lines of dialog like this,\nand they'll be put together into a single statement."
}
}]
Line with text
vnhtml
Jeff Jake and Phil: This takes less vertical space, however.
Statements
[{
"line": {
"promptId": "48363e91-0a73-476b-884a-241cb57387c0",
"characters": ["Jeff", "Jake", "Phil"],
"text": "This takes less vertical space, however."
}
}]
Line with emote and text
vnhtml
Jeff Jake and Phil (otherworldly): This takes less vertical space, however.
Statements
[{
"emote": {
"character": "Jeff",
"emote": "otherworldly"
}
}, {
"emote": {
"character": "Jake",
"emote": "otherworldly"
}
}, {
"emote": {
"character": "Phil",
"emote": "otherworldly"
}
}, {
"line": {
"promptId": "48363e91-0a73-476b-884a-241cb57387c0",
"characters": ["Jeff", "Jake", "Phil"],
"text": "This takes less vertical space, however."
}
}]
Emote
vnhtml
Jeff Jake and Phil are otherworldly
Statements
[{
"emote": {
"character": "Jeff",
"emote": "otherworldly"
}
}, {
"emote": {
"character": "Jake",
"emote": "otherworldly"
}
}, {
"emote": {
"character": "Phil",
"emote": "otherworldly"
}
}]
Leave
vnhtml
Jeff Jake and Phil leave
Statements
[{
"leave": {
"character": "Jeff"
}
}, {
"leave": {
"character": "Jake"
}
}, {
"leave": {
"character": "Phil"
}
}]
Set flag
vnhtml
set window locked
Statements
[{
"set": {
"flag": "window",
"value": "locked
}
}]
If
vnhtml
if window unlocked
Jeff: The window's locked!
Jake: You sure?
Statements
[{
"decision": {
"paths": [{
"condition": {
"flag": {
"flag": "window",
"value": "unlocked"
}
},
"then": [{
"line": {
"characters": ["Jeff"],
"text": "The window's locked!"
}
}, {
"line": {
"characters": ["Jake"],
"text": "You sure?"
}
}]
}]
}
}]
Else if
vnhtml
Jeff: The window's locked!
if window unlocked
Jake: You sure?
else if window open
Jake: I implied locked *closed*.
Statements
[{
"line": {
"characters": ["Jeff"],
"text": "The window's locked!"
}
}, {
"decision": {
"paths": [{
"condition": {
"flag": {
"flag": "window",
"value": "unlocked"
}
},
"then": [{
"line": {
"characters": ["Jake"],
"text": "You sure?"
}
}]
}, {
"condition": {
"flag": {
"flag": "window",
"value": "open"
}
},
"then": [{
"line": {
"characters": ["Jake"],
"text": "I implied locked *closed*."
}
}]
}]
}
}]
Else
vnhtml
Jeff: The window's locked!
if window unlocked
Jake: You sure?
else if window open
Jake: I implied locked *closed*.
else
Jake: Looks right from here.
Statements
[{
"line": {
"characters": ["Jeff"],
"text": "The window's locked!"
}
}, {
"decision": {
"paths": [{
"condition": {
"flag": {
"flag": "window",
"value": "unlocked"
}
},
"then": [{
"line": {
"characters": ["Jake"],
"text": "You sure?"
}
}]
}, {
"condition": {
"flag": {
"flag": "window",
"value": "open"
}
},
"then": [{
"line": {
"characters": ["Jake"],
"text": "I implied locked *closed*."
}
}]
}, {
"condition": null,
"then": [{
"line": {
"characters": ["Jake"],
"text": "Looks right from here."
}
}]
}]
}
}]
Menu
vnhtml
menu
Coffee
Jeff: Why did I pick this!
Jake: You'll have a right headache...
Cake
Jeff: Bad for me, but so good.
Fruit Salad
Jake: Not bad!
Statements
[{
"menu": {
"promptId": "48363e91-0a73-476b-884a-241cb57387c0",
"paths": [{
"label": "Coffee",
"then": [{
"line": {
"characters": ["Jeff"],
"text": "Why did I pick this!"
}
}, {
"line": {
"characters": ["Jake"],
"text": "You'll have a right headache..."
}
}]
}, {
"label": "Cake",
"then": [{
"line": {
"characters": ["Jeff"],
"text": "Bad for me, but so good."
}
}]
}, {
"label": "Fruit Salad",
"then": [{
"line": {
"characters": ["Jeff"],
"text": "Not bad!"
}
}]
}]
}
}]
Label
vnhtml
label fromTheTop
Statements
[{
"label": {
"name": "fromTheTop"
}
}]
Go To
vnhtml
go to fromTheTop
Statements
[{
"goTo": {
"label": "fromTheTop"
}
}]
Background
vnhtml
mountains in background
Statements
[{
"background": {
"name": "mountains"
}
}]
Include
vnhtml
include lengthySidequest
Statements
[{
"include": {
"name": "lengthySidequest"
}
}]