NodeVisitor class for PEG parser in PythonPartial String split in BashCode Coverage for COBOL code in a Jenkins pipelineRepresenting an AST in C with different structs for types of nodesHow is parser rule precedence chosen with left recursion and a greedy '?' operator?Get all parts of a parenthesisfull expressionCalling an external command in PythonWhat are metaclasses in Python?Finding the index of an item given a list containing it in PythonWhat is the difference between Python's list methods append and extend?How can I safely create a nested directory?How do I parse a string to a float or int?Does Python have a ternary conditional operator?How to get the current time in PythonWhy can't Python parse this JSON data?Does Python have a string 'contains' substring method?
What does it mean by "my days-of-the-week underwear only go to Thursday" in this context?
How deep is the liquid in a half-full hemisphere?
What are examples of EU policies that are beneficial for one EU country, disadvantagious for another?
LM324 - Issue with output in negative feedback
Where to find the Arxiv endorsement code?
Why, even after his imprisonment, people keep calling Hannibal Lecter "Doctor"?
Calculate the Ultraradical
Lambda functions with template parameters, not in function parameters
As a team leader is it appropriate to bring in fundraiser candy?
What can Thomas Cook customers who have not yet departed do now it has stopped operating?
Why would an airline put 15 passengers at once on standby?
How to justify getting additional team member when the current team is doing well?
Is there a relationship between prime numbers and music?
Another student has been assigned the same MSc thesis as mine (and already defended)
Create the same subfolders in another folder
What would influence an alien race to map their planet in a way other than the traditional map of the Earth
Is it ok if I haven't decided my research topic when I first meet with a potential phd advisor?
Detail vs. filler
Why is a road bike faster than a city bike with the same effort? How much faster it can be?
Why aren't faces sharp in my f/1.8 portraits even though I'm carefully using center-point autofocus?
A word that refers to saying something in an attempt to anger or embarrass someone into doing something that they don’t want to do?
"until mine is on tight" is a idiom?
Selection Sort Algorithm (Python)
Garage door sticks on a bolt
NodeVisitor class for PEG parser in Python
Partial String split in BashCode Coverage for COBOL code in a Jenkins pipelineRepresenting an AST in C with different structs for types of nodesHow is parser rule precedence chosen with left recursion and a greedy '?' operator?Get all parts of a parenthesisfull expressionCalling an external command in PythonWhat are metaclasses in Python?Finding the index of an item given a list containing it in PythonWhat is the difference between Python's list methods append and extend?How can I safely create a nested directory?How do I parse a string to a float or int?Does Python have a ternary conditional operator?How to get the current time in PythonWhy can't Python parse this JSON data?Does Python have a string 'contains' substring method?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
Imagine the following types of strings:
if ((a1 and b) or (a2 and c)) or (c and d) or (e and f)
Now, I'd like to get the expressions in parentheses, so I wrote a PEG
parser with the following grammar:
from parsimonious.grammar import Grammar
grammar = Grammar(
r"""
program = if expr+
expr = term (operator term)*
term = (factor operator factor) / factor
factor = (lpar word operator word rpar) / (lpar expr rpar)
if = "if" ws
and = "and"
or = "or"
operator = ws? (and / or) ws?
word = ~"w+"
lpar = "("
rpar = ")"
ws = ~"s*"
""")
which parses just fine with
tree = grammar.parse(string)
Now the question arises: how to write a NodeVisitor
class for this tree to get only the factors? My problem here is the second branch which can be deeply nested.
I tried with
def walk(node, level = 0):
if node.expr.name == "factor":
print(level * "-", node.text)
for child in node.children:
walk(child, level + 1)
walk(tree)
but to no avail, really (factors bubble up in duplicates).
Note: This question is based on another one on StackOverflow.
python regex parsing parsimonious
add a comment
|
Imagine the following types of strings:
if ((a1 and b) or (a2 and c)) or (c and d) or (e and f)
Now, I'd like to get the expressions in parentheses, so I wrote a PEG
parser with the following grammar:
from parsimonious.grammar import Grammar
grammar = Grammar(
r"""
program = if expr+
expr = term (operator term)*
term = (factor operator factor) / factor
factor = (lpar word operator word rpar) / (lpar expr rpar)
if = "if" ws
and = "and"
or = "or"
operator = ws? (and / or) ws?
word = ~"w+"
lpar = "("
rpar = ")"
ws = ~"s*"
""")
which parses just fine with
tree = grammar.parse(string)
Now the question arises: how to write a NodeVisitor
class for this tree to get only the factors? My problem here is the second branch which can be deeply nested.
I tried with
def walk(node, level = 0):
if node.expr.name == "factor":
print(level * "-", node.text)
for child in node.children:
walk(child, level + 1)
walk(tree)
but to no avail, really (factors bubble up in duplicates).
Note: This question is based on another one on StackOverflow.
python regex parsing parsimonious
add a comment
|
Imagine the following types of strings:
if ((a1 and b) or (a2 and c)) or (c and d) or (e and f)
Now, I'd like to get the expressions in parentheses, so I wrote a PEG
parser with the following grammar:
from parsimonious.grammar import Grammar
grammar = Grammar(
r"""
program = if expr+
expr = term (operator term)*
term = (factor operator factor) / factor
factor = (lpar word operator word rpar) / (lpar expr rpar)
if = "if" ws
and = "and"
or = "or"
operator = ws? (and / or) ws?
word = ~"w+"
lpar = "("
rpar = ")"
ws = ~"s*"
""")
which parses just fine with
tree = grammar.parse(string)
Now the question arises: how to write a NodeVisitor
class for this tree to get only the factors? My problem here is the second branch which can be deeply nested.
I tried with
def walk(node, level = 0):
if node.expr.name == "factor":
print(level * "-", node.text)
for child in node.children:
walk(child, level + 1)
walk(tree)
but to no avail, really (factors bubble up in duplicates).
Note: This question is based on another one on StackOverflow.
python regex parsing parsimonious
Imagine the following types of strings:
if ((a1 and b) or (a2 and c)) or (c and d) or (e and f)
Now, I'd like to get the expressions in parentheses, so I wrote a PEG
parser with the following grammar:
from parsimonious.grammar import Grammar
grammar = Grammar(
r"""
program = if expr+
expr = term (operator term)*
term = (factor operator factor) / factor
factor = (lpar word operator word rpar) / (lpar expr rpar)
if = "if" ws
and = "and"
or = "or"
operator = ws? (and / or) ws?
word = ~"w+"
lpar = "("
rpar = ")"
ws = ~"s*"
""")
which parses just fine with
tree = grammar.parse(string)
Now the question arises: how to write a NodeVisitor
class for this tree to get only the factors? My problem here is the second branch which can be deeply nested.
I tried with
def walk(node, level = 0):
if node.expr.name == "factor":
print(level * "-", node.text)
for child in node.children:
walk(child, level + 1)
walk(tree)
but to no avail, really (factors bubble up in duplicates).
Note: This question is based on another one on StackOverflow.
python regex parsing parsimonious
python regex parsing parsimonious
edited Mar 28 at 19:47
sophros
3,8343 gold badges14 silver badges39 bronze badges
3,8343 gold badges14 silver badges39 bronze badges
asked Mar 28 at 19:00
JanJan
27.3k5 gold badges31 silver badges55 bronze badges
27.3k5 gold badges31 silver badges55 bronze badges
add a comment
|
add a comment
|
2 Answers
2
active
oldest
votes
How would I go about it to get ((a1 and b) or (a2 and c)), (c and d) and (e and f) as three parts?
You could create a visitor that "listens" when a node in the parse tree is a (
, in which a depth-variable is increased, and when a )
is encountered, the depth-variable is decreased. Then in the method that is called that matches a parenthesised expression, you inspect the depth before adding it to your list of expressions to return from the visitor.
Here a is a quick example:
from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
grammar = Grammar(
r"""
program = if expr+
expr = term (operator term)*
term = (lpar expr rpar) / word
if = "if" ws
and = "and"
or = "or"
operator = ws? (and / or) ws?
word = ~"w+"
lpar = "("
rpar = ")"
ws = ~"s*"
""")
class ParExprVisitor(NodeVisitor):
def __init__(self):
self.depth = 0
self.par_expr = []
def visit_term(self, node, visited_children):
if self.depth == 0:
self.par_expr.append(node.text)
def visit_lpar(self, node, visited_children):
self.depth += 1
def visit_rpar(self, node, visited_children):
self.depth -= 1
def generic_visit(self, node, visited_children):
return self.par_expr
tree = grammar.parse("if ((a1 and b) or (a2 and c)) or (c and d) or (e and f)")
visitor = ParExprVisitor()
for expr in visitor.visit(tree):
print(expr)
which prints:
((a1 and b) or (a2 and c))
(c and d)
(e and f)
Thanks. How would I go about it to get((a1 and b) or (a2 and c))
,(c and d)
and(e and f)
as three parts? Sorry for not being clear in the original question here. The main question imo is how to write a recursiveNodeVisitor
class.
– Jan
Apr 1 at 18:44
1
Ah, I see. Let me have a quick look.
– Bart Kiers
Apr 1 at 18:51
That's a clever one! I'd wait another couple of days with the bounty but that is definately interesting.
– Jan
Apr 1 at 19:39
1
Sure, no problem, I answered because I didn't know thisparsimonious
library, which looked nice. I might have a closer look at it.
– Bart Kiers
Apr 1 at 19:42
add a comment
|
If you only want to return each outermost factor, return
early and do not descend into its children.
def walk(node, level = 0):
if node.expr.name == "factor":
print(level * "-", node.text)
return
for child in node.children:
walk(child, level + 1)
Output:
----- ((a1 and b) or (a2 and c))
----- (c and d)
------ (e and f)
Thanks for your response. However I am merely looking for aNodeVisitor
solution or a hint to reformulate the grammar. With the early returns one can't do anything with the output.
– Jan
Apr 1 at 18:45
add a comment
|
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/4.0/"u003ecc by-sa 4.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55405055%2fnodevisitor-class-for-peg-parser-in-python%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
How would I go about it to get ((a1 and b) or (a2 and c)), (c and d) and (e and f) as three parts?
You could create a visitor that "listens" when a node in the parse tree is a (
, in which a depth-variable is increased, and when a )
is encountered, the depth-variable is decreased. Then in the method that is called that matches a parenthesised expression, you inspect the depth before adding it to your list of expressions to return from the visitor.
Here a is a quick example:
from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
grammar = Grammar(
r"""
program = if expr+
expr = term (operator term)*
term = (lpar expr rpar) / word
if = "if" ws
and = "and"
or = "or"
operator = ws? (and / or) ws?
word = ~"w+"
lpar = "("
rpar = ")"
ws = ~"s*"
""")
class ParExprVisitor(NodeVisitor):
def __init__(self):
self.depth = 0
self.par_expr = []
def visit_term(self, node, visited_children):
if self.depth == 0:
self.par_expr.append(node.text)
def visit_lpar(self, node, visited_children):
self.depth += 1
def visit_rpar(self, node, visited_children):
self.depth -= 1
def generic_visit(self, node, visited_children):
return self.par_expr
tree = grammar.parse("if ((a1 and b) or (a2 and c)) or (c and d) or (e and f)")
visitor = ParExprVisitor()
for expr in visitor.visit(tree):
print(expr)
which prints:
((a1 and b) or (a2 and c))
(c and d)
(e and f)
Thanks. How would I go about it to get((a1 and b) or (a2 and c))
,(c and d)
and(e and f)
as three parts? Sorry for not being clear in the original question here. The main question imo is how to write a recursiveNodeVisitor
class.
– Jan
Apr 1 at 18:44
1
Ah, I see. Let me have a quick look.
– Bart Kiers
Apr 1 at 18:51
That's a clever one! I'd wait another couple of days with the bounty but that is definately interesting.
– Jan
Apr 1 at 19:39
1
Sure, no problem, I answered because I didn't know thisparsimonious
library, which looked nice. I might have a closer look at it.
– Bart Kiers
Apr 1 at 19:42
add a comment
|
How would I go about it to get ((a1 and b) or (a2 and c)), (c and d) and (e and f) as three parts?
You could create a visitor that "listens" when a node in the parse tree is a (
, in which a depth-variable is increased, and when a )
is encountered, the depth-variable is decreased. Then in the method that is called that matches a parenthesised expression, you inspect the depth before adding it to your list of expressions to return from the visitor.
Here a is a quick example:
from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
grammar = Grammar(
r"""
program = if expr+
expr = term (operator term)*
term = (lpar expr rpar) / word
if = "if" ws
and = "and"
or = "or"
operator = ws? (and / or) ws?
word = ~"w+"
lpar = "("
rpar = ")"
ws = ~"s*"
""")
class ParExprVisitor(NodeVisitor):
def __init__(self):
self.depth = 0
self.par_expr = []
def visit_term(self, node, visited_children):
if self.depth == 0:
self.par_expr.append(node.text)
def visit_lpar(self, node, visited_children):
self.depth += 1
def visit_rpar(self, node, visited_children):
self.depth -= 1
def generic_visit(self, node, visited_children):
return self.par_expr
tree = grammar.parse("if ((a1 and b) or (a2 and c)) or (c and d) or (e and f)")
visitor = ParExprVisitor()
for expr in visitor.visit(tree):
print(expr)
which prints:
((a1 and b) or (a2 and c))
(c and d)
(e and f)
Thanks. How would I go about it to get((a1 and b) or (a2 and c))
,(c and d)
and(e and f)
as three parts? Sorry for not being clear in the original question here. The main question imo is how to write a recursiveNodeVisitor
class.
– Jan
Apr 1 at 18:44
1
Ah, I see. Let me have a quick look.
– Bart Kiers
Apr 1 at 18:51
That's a clever one! I'd wait another couple of days with the bounty but that is definately interesting.
– Jan
Apr 1 at 19:39
1
Sure, no problem, I answered because I didn't know thisparsimonious
library, which looked nice. I might have a closer look at it.
– Bart Kiers
Apr 1 at 19:42
add a comment
|
How would I go about it to get ((a1 and b) or (a2 and c)), (c and d) and (e and f) as three parts?
You could create a visitor that "listens" when a node in the parse tree is a (
, in which a depth-variable is increased, and when a )
is encountered, the depth-variable is decreased. Then in the method that is called that matches a parenthesised expression, you inspect the depth before adding it to your list of expressions to return from the visitor.
Here a is a quick example:
from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
grammar = Grammar(
r"""
program = if expr+
expr = term (operator term)*
term = (lpar expr rpar) / word
if = "if" ws
and = "and"
or = "or"
operator = ws? (and / or) ws?
word = ~"w+"
lpar = "("
rpar = ")"
ws = ~"s*"
""")
class ParExprVisitor(NodeVisitor):
def __init__(self):
self.depth = 0
self.par_expr = []
def visit_term(self, node, visited_children):
if self.depth == 0:
self.par_expr.append(node.text)
def visit_lpar(self, node, visited_children):
self.depth += 1
def visit_rpar(self, node, visited_children):
self.depth -= 1
def generic_visit(self, node, visited_children):
return self.par_expr
tree = grammar.parse("if ((a1 and b) or (a2 and c)) or (c and d) or (e and f)")
visitor = ParExprVisitor()
for expr in visitor.visit(tree):
print(expr)
which prints:
((a1 and b) or (a2 and c))
(c and d)
(e and f)
How would I go about it to get ((a1 and b) or (a2 and c)), (c and d) and (e and f) as three parts?
You could create a visitor that "listens" when a node in the parse tree is a (
, in which a depth-variable is increased, and when a )
is encountered, the depth-variable is decreased. Then in the method that is called that matches a parenthesised expression, you inspect the depth before adding it to your list of expressions to return from the visitor.
Here a is a quick example:
from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
grammar = Grammar(
r"""
program = if expr+
expr = term (operator term)*
term = (lpar expr rpar) / word
if = "if" ws
and = "and"
or = "or"
operator = ws? (and / or) ws?
word = ~"w+"
lpar = "("
rpar = ")"
ws = ~"s*"
""")
class ParExprVisitor(NodeVisitor):
def __init__(self):
self.depth = 0
self.par_expr = []
def visit_term(self, node, visited_children):
if self.depth == 0:
self.par_expr.append(node.text)
def visit_lpar(self, node, visited_children):
self.depth += 1
def visit_rpar(self, node, visited_children):
self.depth -= 1
def generic_visit(self, node, visited_children):
return self.par_expr
tree = grammar.parse("if ((a1 and b) or (a2 and c)) or (c and d) or (e and f)")
visitor = ParExprVisitor()
for expr in visitor.visit(tree):
print(expr)
which prints:
((a1 and b) or (a2 and c))
(c and d)
(e and f)
edited Apr 1 at 19:31
answered Apr 1 at 18:38
Bart KiersBart Kiers
137k30 gold badges256 silver badges255 bronze badges
137k30 gold badges256 silver badges255 bronze badges
Thanks. How would I go about it to get((a1 and b) or (a2 and c))
,(c and d)
and(e and f)
as three parts? Sorry for not being clear in the original question here. The main question imo is how to write a recursiveNodeVisitor
class.
– Jan
Apr 1 at 18:44
1
Ah, I see. Let me have a quick look.
– Bart Kiers
Apr 1 at 18:51
That's a clever one! I'd wait another couple of days with the bounty but that is definately interesting.
– Jan
Apr 1 at 19:39
1
Sure, no problem, I answered because I didn't know thisparsimonious
library, which looked nice. I might have a closer look at it.
– Bart Kiers
Apr 1 at 19:42
add a comment
|
Thanks. How would I go about it to get((a1 and b) or (a2 and c))
,(c and d)
and(e and f)
as three parts? Sorry for not being clear in the original question here. The main question imo is how to write a recursiveNodeVisitor
class.
– Jan
Apr 1 at 18:44
1
Ah, I see. Let me have a quick look.
– Bart Kiers
Apr 1 at 18:51
That's a clever one! I'd wait another couple of days with the bounty but that is definately interesting.
– Jan
Apr 1 at 19:39
1
Sure, no problem, I answered because I didn't know thisparsimonious
library, which looked nice. I might have a closer look at it.
– Bart Kiers
Apr 1 at 19:42
Thanks. How would I go about it to get
((a1 and b) or (a2 and c))
, (c and d)
and (e and f)
as three parts? Sorry for not being clear in the original question here. The main question imo is how to write a recursive NodeVisitor
class.– Jan
Apr 1 at 18:44
Thanks. How would I go about it to get
((a1 and b) or (a2 and c))
, (c and d)
and (e and f)
as three parts? Sorry for not being clear in the original question here. The main question imo is how to write a recursive NodeVisitor
class.– Jan
Apr 1 at 18:44
1
1
Ah, I see. Let me have a quick look.
– Bart Kiers
Apr 1 at 18:51
Ah, I see. Let me have a quick look.
– Bart Kiers
Apr 1 at 18:51
That's a clever one! I'd wait another couple of days with the bounty but that is definately interesting.
– Jan
Apr 1 at 19:39
That's a clever one! I'd wait another couple of days with the bounty but that is definately interesting.
– Jan
Apr 1 at 19:39
1
1
Sure, no problem, I answered because I didn't know this
parsimonious
library, which looked nice. I might have a closer look at it.– Bart Kiers
Apr 1 at 19:42
Sure, no problem, I answered because I didn't know this
parsimonious
library, which looked nice. I might have a closer look at it.– Bart Kiers
Apr 1 at 19:42
add a comment
|
If you only want to return each outermost factor, return
early and do not descend into its children.
def walk(node, level = 0):
if node.expr.name == "factor":
print(level * "-", node.text)
return
for child in node.children:
walk(child, level + 1)
Output:
----- ((a1 and b) or (a2 and c))
----- (c and d)
------ (e and f)
Thanks for your response. However I am merely looking for aNodeVisitor
solution or a hint to reformulate the grammar. With the early returns one can't do anything with the output.
– Jan
Apr 1 at 18:45
add a comment
|
If you only want to return each outermost factor, return
early and do not descend into its children.
def walk(node, level = 0):
if node.expr.name == "factor":
print(level * "-", node.text)
return
for child in node.children:
walk(child, level + 1)
Output:
----- ((a1 and b) or (a2 and c))
----- (c and d)
------ (e and f)
Thanks for your response. However I am merely looking for aNodeVisitor
solution or a hint to reformulate the grammar. With the early returns one can't do anything with the output.
– Jan
Apr 1 at 18:45
add a comment
|
If you only want to return each outermost factor, return
early and do not descend into its children.
def walk(node, level = 0):
if node.expr.name == "factor":
print(level * "-", node.text)
return
for child in node.children:
walk(child, level + 1)
Output:
----- ((a1 and b) or (a2 and c))
----- (c and d)
------ (e and f)
If you only want to return each outermost factor, return
early and do not descend into its children.
def walk(node, level = 0):
if node.expr.name == "factor":
print(level * "-", node.text)
return
for child in node.children:
walk(child, level + 1)
Output:
----- ((a1 and b) or (a2 and c))
----- (c and d)
------ (e and f)
answered Mar 31 at 20:33
Jan-GerdJan-Gerd
7923 silver badges7 bronze badges
7923 silver badges7 bronze badges
Thanks for your response. However I am merely looking for aNodeVisitor
solution or a hint to reformulate the grammar. With the early returns one can't do anything with the output.
– Jan
Apr 1 at 18:45
add a comment
|
Thanks for your response. However I am merely looking for aNodeVisitor
solution or a hint to reformulate the grammar. With the early returns one can't do anything with the output.
– Jan
Apr 1 at 18:45
Thanks for your response. However I am merely looking for a
NodeVisitor
solution or a hint to reformulate the grammar. With the early returns one can't do anything with the output.– Jan
Apr 1 at 18:45
Thanks for your response. However I am merely looking for a
NodeVisitor
solution or a hint to reformulate the grammar. With the early returns one can't do anything with the output.– Jan
Apr 1 at 18:45
add a comment
|
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55405055%2fnodevisitor-class-for-peg-parser-in-python%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown