Comments (4)
pycparser is a parser and from parser you don't expect any understanding for semantics. I consider this a correct behaviour as I actually want to know if there are braces or not that is if it is a compound statement or not. You need to handle this on your side as this really depends on what you want to do. These ASTs are different because the code is different and AST represents code not meaning or anything else.
from pycparser.
As I noted in a different issue, pycparser makes no attempt to preserve syntactic information. It produces an AST, not a parse tree [http://eli.thegreenplace.net/2009/02/16/abstract-vs-concrete-syntax-trees/]
The example here is just one small one, there's an infinite amount of them - you can not faithfully reproduce the incoming source from pycparser; it's not, has never been, its design goal.
from pycparser.
Thank you for your persuasive comments. I will do on my side.
from pycparser.
I think this visitor braces all unbraced statements.
I referred to BNF grammer here and thought these are complete.
http://www.lysator.liu.se/c/ANSI-C-grammar-y.html#statement
class Brace(c_ast.NodeVisitor):
def visit_If(self, n):
if not isinstance(n.iftrue, c_ast.Compound):
comp = c_ast.Compound([n.iftrue])
n.iftrue = comp
if not isinstance(n.iffalse, c_ast.Compound):
comp = c_ast.Compound([n.iffalse])
n.iffalse = comp
c_ast.NodeVisitor.generic_visit(self, n)
def visit_Case(self, n):
if not isinstance(n.stmts, c_ast.Compound):
comp = c_ast.Compound(n.stmts)
n.stmts = [comp]
c_ast.NodeVisitor.generic_visit(self, n)
def visit_Default(self, n):
if not isinstance(n.stmts, c_ast.Compound):
comp = c_ast.Compound(n.stmts)
n.stmts = [comp]
c_ast.NodeVisitor.generic_visit(self, n)
def visit_Switch(self, n):
if not isinstance(n.stmt, c_ast.Compound):
comp = c_ast.Compound([n.stmt])
n.stmt = comp
c_ast.NodeVisitor.generic_visit(self, n)
def visit_For(self, n):
if not isinstance(n.stmt, c_ast.Compound):
comp = c_ast.Compound([n.stmt])
n.stmt = comp
c_ast.NodeVisitor.generic_visit(self, n)
def visit_While(self, n):
if not isinstance(n.stmt, c_ast.Compound):
comp = c_ast.Compound([n.stmt])
n.stmt = comp
c_ast.NodeVisitor.generic_visit(self, n)
def visit_DoWhile(self, n):
if not isinstance(n.stmt, c_ast.Compound):
comp = c_ast.Compound([n.stmt])
n.stmt = comp
c_ast.NodeVisitor.generic_visit(self, n)
from pycparser.
Related Issues (20)
- c_generator returning a dict mapping the nodes to their position in the resulting code HOT 1
- Support for __attribute__((weak)) HOT 1
- pycparser.plyparser.ParseError: xx/include/vadefs.h:24:28: before: __gnuc_va_list HOT 4
- Enable OpenSSF Scorecard Action and Badge HOT 2
- make pycparser work with linux kernel code HOT 4
- Missing ; when generating code for extern functions
- Can
- Can't parse incomplete types and other syntactically valid but non-compilable code HOT 1
- Curly braces inside braced-group throws ParseError HOT 2
- AssertionError
- Two-dimensional array binding type problem HOT 1
- Is there a release plan for the next version of pycparser?
- parser error with typedef HOT 10
- assertion error on gcc-9 stddef.h
- Is there a way to find the function declaration matching a function call? HOT 1
- CParser doesn't work with comments HOT 1
- Add end of token coord
- Unable to parse labels at end of block HOT 1
- BUG: pycparser treats empty declarations as a binary operation HOT 1
- TypeError:'Nonetype' object is not callable HOT 5
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from pycparser.