You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Before running the sketch, check if all references are valid #17
Currently resolving references happens at runtime, which means sketches like this only fail 50% of the time:
root:
- This line is fine
- This line contains an invalid {{ reference }}
To avoid these errors happening at runtime I suggest creating a validation step in parsePhraseBook that checks if all references in the script are valid.
This would require another loop to be run after the already running loop, because once the first loop is completed then only we can determine whether a reference is defined or not.
If I am going in the right direction, can I try this?
Because before running the code we already have the phrase book, and a
syntax tree through which all of the code runs. After parsing the code, the
syntax tree needs to be traversed and every time a key is
encountered (node.type === NODE_KEY) it should be checked against the
phrase book. One caveat though, this key could also refer to an argument
that has been passed, or an import key.
2018-02-21 7:02 GMT+01:00 k-cap <notifications@github.com>:
Wait, I don't think I got this right.
Say for example, we have
root:
- This is {{ reference1 }} //(*)
- This is {{ reference2 }} //(**)
//(***)
reference1:
- Some stuff
reference3:
- Some stuff
How will we know at line (*) and (**) that reference1 and reference2 are
defined after (***) or not, without running the code "normally"
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
<#17 (comment)>, or mute
the thread
<https://github.com/notifications/unsubscribe-auth/AADAvgPZ8ch4GrDdGM8xhLtBwC4gR7PUks5tW7F6gaJpZM4SKxjQ>
.
No, it should be checked after everything is parsed, before returning the phraseBook, so yes, inside the parsePhrasebook function, but at the end. Because it is only at this point we know for sure what all the phrases and references are.
No, the check needs to perform a similar action as what happens in the Interpreter class. For each phrase, the Parser class returns a tree of nodes of a certain type, some of these nodes are of type NODE_KEY, it's these ones that need to be checked against the whole of the phraseBook. Since these nodes are "buried" within the tree, the tree needs to be traversed, like what happens in the visit(node) function.
Activity
kunal-mohta commentedon Feb 19, 2018
This would require another loop to be run after the already running loop, because once the first loop is completed then only we can determine whether a reference is defined or not.
If I am going in the right direction, can I try this?
fdb commentedon Feb 20, 2018
Actually we just need to check all references we encounter during parsing. We don't need to run the code "normally" at all.
Give it a try if you want!
kunal-mohta commentedon Feb 20, 2018
Okay, I will give it a try.
kunal-mohta commentedon Feb 21, 2018
Wait, I don't think I got this right.
Say for example, we have
How will we know at line
(*)and(**)thatreference1andreference2are defined after(***)or not, without running the code "normally"stebanos commentedon Feb 21, 2018
kunal-mohta commentedon Feb 21, 2018
Oh! Okay. I thought you were planning to implement this inside
parsePharsebook()function.kunal-mohta commentedon Feb 21, 2018
Should the check be included here
fdb commentedon Feb 22, 2018
No idea. @stebanos ?
stebanos commentedon Feb 22, 2018
No, it should be checked after everything is parsed, before returning the phraseBook, so yes, inside the parsePhrasebook function, but at the end. Because it is only at this point we know for sure what all the phrases and references are.
kunal-mohta commentedon Feb 22, 2018
Won't that mean rewriting the code that extracts the references from
{{ ... }}, that already has been written?stebanos commentedon Feb 22, 2018
No, the check needs to perform a similar action as what happens in the Interpreter class. For each phrase, the Parser class returns a tree of nodes of a certain type, some of these nodes are of type NODE_KEY, it's these ones that need to be checked against the whole of the phraseBook. Since these nodes are "buried" within the tree, the tree needs to be traversed, like what happens in the visit(node) function.