| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Make sure to invalidate finder caches before trying to import generated
modules. This is necessary according to the Python documentation:
https://docs.python.org/3/library/importlib.html#importlib.invalidate_caches
This fixes a hard-to-reproduce bug that Python would be unable to find
just-generated `lextab.py` if mtime of the current directory did not
change from the moment the script was started. This could
e.g. be the case if one has second-precision timestamps and removes
the generated file just before starting the build, e.g.:
$ rm pycparser/lextab.py; python -m build -nw
It could also be reproduced easier by doing something like:
$ cd pycparser
$ touch .; python -B _build_tables.py
Traceback (most recent call last):
File "/var/tmp/pycparser/pycparser/_build_tables.py", line 38, in <module>
import lextab
ModuleNotFoundError: No module named 'lextab'
This is because the first command (`rm` or `touch`) updates the mtime
of the directory to the current time. If the script is run fast enough,
it manages to scan the directory and then write the new `lextab.py`
within the same second. As a result, mtime of the directory after
writing the new file is the same as when the script was started, finder
does not invalidate the cache and assumes that `lextab.py` does not
exist since it did not exist when the directory was scanned earlier.
This potentially fixes #493.
It was originally reported on https://bugs.gentoo.org/701878.
Thanks to Gary E. Miller for patience in reproducing the problem
and proxy-debugging it for me, as well as testing the final patch before
submission.
|
|
|
|
|
|
|
|
|
| |
* Support _Pragma, a C99 alternative to #pragma
See https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html
* Test cases for _Pragma
* Add explanatory comment for _PRAGMA and PPPRAGMA
|
| |
|
| |
|
|
|
|
| |
updates #438
|
|
|
|
|
| |
* Fix typos
* Revert changes in vendor module
|
|
|
|
|
|
|
|
|
| |
* Fix PEP8 [E101](https://github.com/PyCQA/pycodestyle/blob/2.8.0/docs/intro.rst#error-codes)
* Fix PEP8 [E711](https://github.com/PyCQA/pycodestyle/blob/2.8.0/docs/intro.rst#error-codes)
* Fix E999 (python2)
* Fix PEP8 [F401](https://flake8.pycqa.org/en/4.0.1/user/error-codes.html)
|
|
|
| |
Co-authored-by: vit9696 <vit9696@users.noreply.github.com>
|
|
|
|
|
|
|
| |
* Implement u8, u, and U strings from C11
* Also add u8, u, and U chars from C11 and C23
Co-authored-by: vit9696 <vit9696@users.noreply.github.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Implement _Alignas and _Alignof support with tests
* Improve testing and avoid unnecessary alignas for typedef
* Add more tests
* Drop legacy artifact
* Remove extra _add_declaration_specifier call
* Drop custom equality comparators for now
Co-authored-by: vit9696 <vit9696@users.noreply.github.com>
|
| |
|
| |
|
|
|
|
|
|
|
|
|
| |
* Improve _Atomic support with more tests and fix typedef handling
* Remove duplicated tests and check the generated code for typedefs
* Add typedef testing to parser as well
Co-authored-by: vit9696 <vit9696@users.noreply.github.com>
|
|
|
|
| |
Now it matches the yacc flag name
|
|
|
|
| |
Updates #430
|
|
|
|
|
| |
Now the ASTs produced are more correct, and more complex cases work like
nested _Atomic(...) specifiers.
|
|
|
|
|
| |
Based on #431 by vit9696
Updates #430
|
|
|
|
|
|
|
| |
This adds initial implementation for the _Atomic keyword in C11, only focusing
on the use as qualifier (spec section 6.7.3)
Based on #431 by vit9696. Updates #430
|
|
|
|
|
|
|
|
|
|
| |
* Introduce partial C11 support
Implemented _Noreturn, _Static_assert, _Thread_local. Also fixed
tests with preprocessor on macOS.
* Add more tests
Co-authored-by: vit9696 <vit9696@users.noreply.github.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* c_parser: support parenthesized compounds
Support parenthesized compound statements as described here:
https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
Signed-off-by: Jordan Yates <jordan.yates@data61.csiro.au>
* test_c_parser: support additional initializers
Add support to `expand_init` for additional `c_ast` types. If a type
is not explicitly handled, return the type name instead of `None`.
Signed-off-by: Jordan Yates <jordan.yates@data61.csiro.au>
* test_c_parser: test parenthesized compounds
Add parsing tests for various situations of parenthesized compound
statements. The complete tree generated by the test string is:
```
FileAST:
FuncDef:
Decl: foo, [], [], []
FuncDecl:
TypeDecl: foo, []
IdentifierType: ['void']
Compound:
Decl: a, [], [], []
TypeDecl: a, []
IdentifierType: ['int']
Compound:
Compound:
Constant: int, 1
Compound:
Constant: int, 1
Constant: int, 2
Decl: b, [], [], []
TypeDecl: b, []
IdentifierType: ['int']
Compound:
Constant: int, 1
Decl: c, [], [], []
TypeDecl: c, []
IdentifierType: ['int']
Decl: d, [], [], []
TypeDecl: d, []
IdentifierType: ['int']
Compound:
Decl: x, [], [], []
TypeDecl: x, []
IdentifierType: ['int']
Constant: int, 1
BinaryOp: +
ID: x
Constant: int, 2
Assignment: =
ID: a
Compound:
Decl: x, [], [], []
TypeDecl: x, []
IdentifierType: ['int']
Constant: int, 1
BinaryOp: *
Constant: int, 2
ID: x
```
Signed-off-by: Jordan Yates <jordan.yates@data61.csiro.au>
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Fix #385: generate code with nested sizeofs
* Fix #378: replace assertion with check
Only the assertion inside `_build_function_definition` is replaced. The
assertion is not appropriate because there are possible inputs that
would trigger the assertion, they're just grammatically incorrect. Thus,
it is replaced with a check that raises `ParseError` on failure.
* Fix #379: parse struct with nested enum
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Recognize integer multicharacter constants like 'ABCD'
The feature I am adding is defined here - 5th case.
https://en.cppreference.com/w/c/language/character_constant
Also here: 6.4.4.4.10 of C99.
Put simply, pycparser thought a statement like this is an error:
int a = 'ABCD';
However it is not.
It is likely possible to just modify char_const regular expression in c_lexer.py:240 to allow longer characters, but the way it is done in this PR - multicharacter constants are clearly separated. I am also limiting the length of multicharacter const integers to 4 characters - this matches VS compiler behavior (gcc allows any length with a warning) and lets pycparser NOT consider lengthy single-quoted strings as integers - these would be nonsensical anyway.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Fix slow backtracking when parsing strings (no external deps)
Fixes #61
This uses negative lookaheads to avoid ambiguity in how string should be
parsed by the regex.
- https://docs.python.org/2/library/re.html#regular-expression-syntax
- Previously, if it didn't immediately succeed at parsing an escape
sequence such as `\123`, it would have to try `\1`+`23`, `\12` + `3`,
and `\123`, which multiplied the time taken by 3 per additional escape
sequence. This solves that by only allowing `\123`
- The same fix was added for hex escapes.
Also fix a test that relied on the incorrect handling of regexes.
The implementation documentation says that it intends to allow
**decimal** escapes permissively.
* WIP debug
* Fix ambiguity caused by allowing #path directives
Solve this by allowing "\x" when not followed by hex,
in the regular string literal.
In the previous commits,
`\x12` could be parsed both as `\x`+`12` and `\x12`,
which caused exponential options for backtracking.
* Document changes to lexer, remove debug code
* Optimize this for strings
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Fix error transforming an empty switch
The parser would crash on that line for `switch(1) {}`
because NoneType is not iterable.
Fixes #345
* Add a test of empty switch statements
* Address review comments
|
|
|
|
| |
return type (#329)
|
|
|
|
|
| |
qualifiers (#327)
Fixes #314
|
| |
|
| |
|
|
|
|
| |
Restricted environments like embeddable python do not include the
current working directory on startup.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Add visit_PtrDecl to generate ptr types correctly
Also removed code duplication from visit_ArrayDecl and visit_TypeDecl by calling _generate_type instead, without emitting the declname.
Added tests for ptr type generation
* Truncate lines longer than 80 characters
per https://github.com/eliben/pycparser/pull/315/files#r269553083
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Fix array type generation (#312)
Also added dim_quals handling to _generate_type
Exmaple:
>>> ast = parser.parse('int g(const int a[const 20]){}')
>>> gen.visit(ast.ext[0].decl.type.args.params[0])
'const int a[const 20]'
>>> gen.visit(ast.ext[0].decl.type.args.params[0].type)
'int[const 20]'
* Added TypeDecl generation. Added tests
|
| |
|
|
|
|
|
|
|
|
|
|
| |
function. (#295)"
This reverts commit 1083b55c64d6235b00f40070e452b9b2605b23da.
encoding is not portable across the list of supported Python versions
See #296
|
|
|
|
|
|
| |
(#295)
Description:
For some Chinese Unicode c files, parse_file may fail if not providing proper `encoding` information. Adding `encoding` parameter will give users the option of providing correct file encoding.
|
| |
|
|
|
|
|
|
| |
* Corrects the type attribute of a constant node when parsing doubles. This sets the type attribute to either 'float', 'long double' or 'double' depending on if 'f|F', 'l|L' or '' is specified at the end of the constant definition.
* Add tests for previous changes.
|
|\ |
|
| |
| |
| |
| |
| |
| |
| |
| | |
Generators have been available since 2.3. The feature is automatically
included in all supported Pythons.
For additional details, see:
https://docs.python.org/3/library/__future__.html
|
| | |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Opening files with 'U' mode is deprecated. When running tests with
Python warnings enabled, the warnings of the following form are emitted:
DeprecationWarning: 'U' mode is deprecated
return open(name, 'rU')
To open files with universal newlines on both Ptyhon 2 & 3, use the io
module. It defaults to opening with universal newlines and doesn't emit
a warning.
https://docs.python.org/3/library/io.html
> When reading input from the stream, if newline is None, universal
> newlines mode is enabled.
|
|/ |
|
| |
|