mirror of
https://github.com/python/cpython.git
synced 2025-11-02 03:01:58 +00:00
gh-102033: Fix syntax error in Tools/c-analyzer (GH-102066)
The easiest way to format strings with `{}` meaningful chars is via `%`.
This commit is contained in:
parent
7559f5fda9
commit
1ca315538f
14 changed files with 3 additions and 335 deletions
|
|
@ -1,10 +1,7 @@
|
|||
import logging
|
||||
import os.path
|
||||
import sys
|
||||
|
||||
from c_common import fsutil
|
||||
from c_common.scriptutil import (
|
||||
CLIArgSpec as Arg,
|
||||
add_verbosity_cli,
|
||||
add_traceback_cli,
|
||||
add_kind_filtering_cli,
|
||||
|
|
@ -15,7 +12,6 @@ from c_common.scriptutil import (
|
|||
get_prog,
|
||||
main_for_filenames,
|
||||
)
|
||||
from .preprocessor import get_preprocessor
|
||||
from .preprocessor.__main__ import (
|
||||
add_common_cli as add_preprocessor_cli,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,244 +0,0 @@
|
|||
|
||||
f'''
|
||||
struct {ANON_IDENTIFIER};
|
||||
struct {{ ... }}
|
||||
struct {IDENTIFIER} {{ ... }}
|
||||
|
||||
union {ANON_IDENTIFIER};
|
||||
union {{ ... }}
|
||||
union {IDENTIFIER} {{ ... }}
|
||||
|
||||
enum {ANON_IDENTIFIER};
|
||||
enum {{ ... }}
|
||||
enum {IDENTIFIER} {{ ... }}
|
||||
|
||||
typedef {VARTYPE} {IDENTIFIER};
|
||||
typedef {IDENTIFIER};
|
||||
typedef {IDENTIFIER};
|
||||
typedef {IDENTIFIER};
|
||||
'''
|
||||
|
||||
|
||||
def parse(srclines):
|
||||
if isinstance(srclines, str): # a filename
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
|
||||
# This only handles at most 10 nested levels.
|
||||
#MATCHED_PARENS = textwrap.dedent(rf'''
|
||||
# # matched parens
|
||||
# (?:
|
||||
# [(] # level 0
|
||||
# (?:
|
||||
# [^()]*
|
||||
# [(] # level 1
|
||||
# (?:
|
||||
# [^()]*
|
||||
# [(] # level 2
|
||||
# (?:
|
||||
# [^()]*
|
||||
# [(] # level 3
|
||||
# (?:
|
||||
# [^()]*
|
||||
# [(] # level 4
|
||||
# (?:
|
||||
# [^()]*
|
||||
# [(] # level 5
|
||||
# (?:
|
||||
# [^()]*
|
||||
# [(] # level 6
|
||||
# (?:
|
||||
# [^()]*
|
||||
# [(] # level 7
|
||||
# (?:
|
||||
# [^()]*
|
||||
# [(] # level 8
|
||||
# (?:
|
||||
# [^()]*
|
||||
# [(] # level 9
|
||||
# (?:
|
||||
# [^()]*
|
||||
# [(] # level 10
|
||||
# [^()]*
|
||||
# [)]
|
||||
# )*
|
||||
# [^()]*
|
||||
# [)]
|
||||
# )*
|
||||
# [^()]*
|
||||
# [)]
|
||||
# )*
|
||||
# [^()]*
|
||||
# [)]
|
||||
# )*
|
||||
# [^()]*
|
||||
# [)]
|
||||
# )*
|
||||
# [^()]*
|
||||
# [)]
|
||||
# )*
|
||||
# [^()]*
|
||||
# [)]
|
||||
# )*
|
||||
# [^()]*
|
||||
# [)]
|
||||
# )*
|
||||
# [^()]*
|
||||
# [)]
|
||||
# )*
|
||||
# [^()]*
|
||||
# [)]
|
||||
# )*
|
||||
# [^()]*
|
||||
# [)]
|
||||
# )
|
||||
# # end matched parens
|
||||
# ''')
|
||||
|
||||
r'''
|
||||
# for loop
|
||||
(?:
|
||||
\s* \b for
|
||||
\s* [(]
|
||||
(
|
||||
[^;]* ;
|
||||
[^;]* ;
|
||||
.*?
|
||||
) # <header>
|
||||
[)]
|
||||
\s*
|
||||
(?:
|
||||
(?:
|
||||
(
|
||||
{_ind(SIMPLE_STMT, 6)}
|
||||
) # <stmt>
|
||||
;
|
||||
)
|
||||
|
|
||||
( {{ ) # <open>
|
||||
)
|
||||
)
|
||||
|
|
||||
|
||||
|
||||
|
||||
(
|
||||
(?:
|
||||
(?:
|
||||
(?:
|
||||
{_ind(SIMPLE_STMT, 6)}
|
||||
)?
|
||||
return \b \s*
|
||||
{_ind(INITIALIZER, 5)}
|
||||
)
|
||||
|
|
||||
(?:
|
||||
(?:
|
||||
{IDENTIFIER} \s*
|
||||
(?: . | -> ) \s*
|
||||
)*
|
||||
{IDENTIFIER}
|
||||
\s* = \s*
|
||||
{_ind(INITIALIZER, 5)}
|
||||
)
|
||||
|
|
||||
(?:
|
||||
{_ind(SIMPLE_STMT, 5)}
|
||||
)
|
||||
)
|
||||
|
|
||||
# cast compound literal
|
||||
(?:
|
||||
(?:
|
||||
[^'"{{}};]*
|
||||
{_ind(STRING_LITERAL, 5)}
|
||||
)*
|
||||
[^'"{{}};]*?
|
||||
[^'"{{}};=]
|
||||
=
|
||||
\s* [(] [^)]* [)]
|
||||
\s* {{ [^;]* }}
|
||||
)
|
||||
) # <stmt>
|
||||
|
||||
|
||||
|
||||
# compound statement
|
||||
(?:
|
||||
(
|
||||
(?:
|
||||
|
||||
# "for" statements are handled separately above.
|
||||
(?: (?: else \s+ )? if | switch | while ) \s*
|
||||
{_ind(COMPOUND_HEAD, 5)}
|
||||
)
|
||||
|
|
||||
(?: else | do )
|
||||
# We do not worry about compound statements for labels,
|
||||
# "case", or "default".
|
||||
)? # <header>
|
||||
\s*
|
||||
( {{ ) # <open>
|
||||
)
|
||||
|
||||
|
||||
|
||||
(
|
||||
(?:
|
||||
[^'"{{}};]*
|
||||
{_ind(STRING_LITERAL, 5)}
|
||||
)*
|
||||
[^'"{{}};]*
|
||||
# Presumably we will not see "== {{".
|
||||
[^\s='"{{}};]
|
||||
)? # <header>
|
||||
|
||||
|
||||
|
||||
(
|
||||
\b
|
||||
(?:
|
||||
# We don't worry about labels with a compound statement.
|
||||
(?:
|
||||
switch \s* [(] [^{{]* [)]
|
||||
)
|
||||
|
|
||||
(?:
|
||||
case \b \s* [^:]+ [:]
|
||||
)
|
||||
|
|
||||
(?:
|
||||
default \s* [:]
|
||||
)
|
||||
|
|
||||
(?:
|
||||
do
|
||||
)
|
||||
|
|
||||
(?:
|
||||
while \s* [(] [^{{]* [)]
|
||||
)
|
||||
|
|
||||
#(?:
|
||||
# for \s* [(] [^{{]* [)]
|
||||
# )
|
||||
#|
|
||||
(?:
|
||||
if \s* [(]
|
||||
(?: [^{{]* [^)] \s* {{ )* [^{{]*
|
||||
[)]
|
||||
)
|
||||
|
|
||||
(?:
|
||||
else
|
||||
(?:
|
||||
\s*
|
||||
if \s* [(]
|
||||
(?: [^{{]* [^)] \s* {{ )* [^{{]*
|
||||
[)]
|
||||
)?
|
||||
)
|
||||
)
|
||||
)? # <header>
|
||||
'''
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
from collections import namedtuple
|
||||
import enum
|
||||
import os.path
|
||||
import re
|
||||
|
||||
from c_common import fsutil
|
||||
|
|
@ -8,7 +7,7 @@ from c_common.clsutil import classonly
|
|||
import c_common.misc as _misc
|
||||
import c_common.strutil as _strutil
|
||||
import c_common.tables as _tables
|
||||
from .parser._regexes import SIMPLE_TYPE, _STORAGE
|
||||
from .parser._regexes import _STORAGE
|
||||
|
||||
|
||||
FIXED_TYPE = _misc.Labeled('FIXED_TYPE')
|
||||
|
|
|
|||
|
|
@ -1,6 +0,0 @@
|
|||
|
||||
def _parse(srclines, anon_name):
|
||||
text = ' '.join(l for _, l in srclines)
|
||||
|
||||
from ._delim import parse
|
||||
yield from parse(text, anon_name)
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
import re
|
||||
import textwrap
|
||||
|
||||
from ._regexes import _ind, STRING_LITERAL
|
||||
|
||||
|
||||
def parse(text, anon_name):
|
||||
context = None
|
||||
data = None
|
||||
for m in DELIMITER_RE.find_iter(text):
|
||||
before, opened, closed = m.groups()
|
||||
delim = opened or closed
|
||||
|
||||
handle_segment = HANDLERS[context][delim]
|
||||
result, context, data = handle_segment(before, delim, data)
|
||||
if result:
|
||||
yield result
|
||||
|
||||
|
||||
DELIMITER = textwrap.dedent(rf'''
|
||||
(
|
||||
(?:
|
||||
[^'"()\[\]{};]*
|
||||
{_ind(STRING_LITERAL, 3)}
|
||||
}*
|
||||
[^'"()\[\]{};]+
|
||||
)? # <before>
|
||||
(?:
|
||||
(
|
||||
[(\[{]
|
||||
) # <open>
|
||||
|
|
||||
(
|
||||
[)\]};]
|
||||
) # <close>
|
||||
)?
|
||||
''')
|
||||
DELIMITER_RE = re.compile(DELIMITER, re.VERBOSE)
|
||||
|
||||
_HANDLERS = {
|
||||
None: { # global
|
||||
# opened
|
||||
'{': ...,
|
||||
'[': None,
|
||||
'(': None,
|
||||
# closed
|
||||
'}': None,
|
||||
']': None,
|
||||
')': None,
|
||||
';': ...,
|
||||
},
|
||||
'': {
|
||||
},
|
||||
}
|
||||
|
|
@ -9,7 +9,6 @@ from ._common import (
|
|||
set_capture_groups,
|
||||
)
|
||||
from ._compound_decl_body import DECL_BODY_PARSERS
|
||||
#from ._func_body import parse_function_body
|
||||
from ._func_body import parse_function_statics as parse_function_body
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue