OXIESEC PANEL
- Current Dir:
/
/
opt
/
gsutil
/
third_party
/
pyparsing
/
examples
Server IP: 2a02:4780:11:1594:0:ef5:22d7:a
Upload:
Create Dir:
Name
Size
Modified
Perms
๐
..
-
12/11/2024 09:39:44 AM
rwxr-xr-x
๐
0README.html
10.75 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
AcManForm.dfm
38.22 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
LAparser.py
20.62 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
Setup.ini
1.41 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
SimpleCalc.py
3.58 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
SingleForm.dfm
42.7 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
TAP.py
7.42 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
__init__.py
0 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
adventureEngine.py
21.59 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
antlr_grammar.py
10.88 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
antlr_grammar_tests.py
2.89 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
apicheck.py
2.2 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
bf.py
4.15 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
bigquery_view_parser.py
62.51 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
booleansearchparser.py
15.26 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
btpyparse.py
4.16 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
builtin_parse_action_demo.py
817 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
cLibHeader.py
853 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
chemical_formulas.py
3.17 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
commasep.py
707 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
configParse.py
2 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
cpp_enum_parser.py
1.35 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
cuneiform_python.py
2.57 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
datetime_parse_actions.py
1.9 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
decaf_parser.py
6.87 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
delta_time.py
21.49 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
dfmparse.py
7.05 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
dhcpd_leases_parser.py
2.98 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
dictExample.py
1.73 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
dictExample2.py
2.1 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
directx_x_file_parser.py
5.54 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
ebnf.py
4.15 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
ebnftest.py
2.35 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
email_address_parser.py
1.18 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
eval_arith.py
6.15 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
excel_expr.py
2.2 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
fourFn.py
10.27 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
gen_ctypes.py
5.28 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
getNTPserversNew.py
1.11 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
greeting.py
518 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
greetingInGreek.py
425 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
greetingInKorean.py
495 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
groupUsingListAllMatches.py
509 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
hola_mundo.py
2.02 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
html_stripper.py
1.68 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
html_table_parser.py
2.16 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
httpServerLogParser.py
3.48 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
idlParse.py
7.53 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
include_preprocessor.py
2.63 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
indentedGrammarExample.py
1022 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
indented_block_example.py
712 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
inv_regex.py
8.08 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
javascript_grammar.g
18.1 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
jsonParser.py
4.7 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
left_recursion.py
1.41 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
lineno_example.py
1.49 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
listAllMatches.py
1.57 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
lua_parser.py
7.96 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
lucene_grammar.py
8.46 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
macro_expander.py
1.77 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
make_diagram.py
1.62 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
matchPreviousDemo.py
586 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
mongodb_query_expression.py
8.46 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
mozilla.ics
752 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
mozillaCalendarParser.py
2.71 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
nested.py
579 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
nested_markup.py
1.85 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
number_words.py
3.77 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
numerics.py
1.34 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
oc.py
4.34 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
one_to_ninety_nine.py
1.88 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
parseTabularData.py
1.68 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
parse_python_value.py
2.5 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
parse_results_sum_example.py
853 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
partial_gene_match.py
2.33 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
pgn.py
3.34 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
position.py
2.17 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
protobuf_parser.py
3.89 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
pythonGrammarParser.py
8.08 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
railroad_diagram_demo.py
1.55 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
range_check.py
2.84 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
readJson.py
120.73 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
removeLineBreaks.py
1.8 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
roman_numerals.py
3.57 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
rosettacode.py
7.43 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
scanExamples.py
2.36 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
searchParserAppDemo.py
962 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
searchparser.py
10.4 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
select_parser.py
8.32 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
sexpParser.py
5.23 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
shapes.py
1.69 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
simpleArith.py
2.42 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
simpleBool.py
3.19 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
simpleSQL.py
3.16 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
simpleWiki.py
1.08 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
snmp_api.h
28.69 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
sql2dot.py
3.07 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
stackish.py
2.71 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
statemachine
-
08/25/2024 02:43:42 PM
rwxr-xr-x
๐
tag_emitter.py
1.17 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
tag_metadata.py
805 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
test_bibparse.py
8.72 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
unicode_denormalizer.py
5.02 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
urlExtractor.py
1.03 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
urlExtractorNew.py
2.4 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
verilog_parse.py
31.15 KB
08/25/2024 02:43:42 PM
rw-r--r--
๐
withAttribute.py
912 bytes
08/25/2024 02:43:42 PM
rw-r--r--
๐
wordsToNum.py
2.92 KB
08/25/2024 02:43:42 PM
rw-r--r--
Editing: unicode_denormalizer.py
Close
# unicode_denormalizer.py # # Demonstration of the pyparsing's transform_string() method, to # convert identifiers in Python source code to equivalent Unicode # characters. Python's compiler automatically normalizes Unicode # characters back to their ASCII equivalents, so that identifiers may # be rewritten using other Unicode characters, and normalize back to # the same identifier. For instance, Python treats "print" and "๐ก๐ปแตข๐๐" # and "๐๐๐๐แต" all as the same identifier. # # The converter must take care to *only* transform identifiers - # Python keywords must always be represented in base ASCII form. To # skip over keywords, they are added to the parser/transformer, but # contain no transforming parse action. # # The converter also detects identifiers in placeholders within f-strings. # # Copyright 2022, by Paul McGuire # import keyword import random import unicodedata import pyparsing as pp ppu = pp.pyparsing_unicode _ยท = "_ยท" ident_chars = ( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789" + _ยท ) # build map of each ASCII character to a string of # all the characters in the Basic Multilingual Plane # that NFKC normalizes back to that ASCII character ident_char_map = {c: [] for c in ident_chars} for ch in ppu.BMP.identbodychars: normal = unicodedata.normalize("NFKC", ch) if normal in ident_char_map: ident_char_map[normal].append(ch) # ligatures will also normalize back to ASCII # (doubled elements have higher chance of being chosen by random.choice) ligature_map = { 'IJ': ('ฤฒ', 'ฤฒ', 'IJ'), 'LJ': ('ว', 'ว', 'LJ'), 'NJ': ('ว', 'ว', 'NJ'), 'DZ': ('วฑ', 'วฑ', 'DZ'), 'II': ('โ ก', 'โ ก', 'II'), 'IV': ('โ ฃ', 'โ ฃ', 'IV'), 'VI': ('โ ฅ', 'โ ฅ', 'VI'), 'IX': ('โ จ', 'โ จ', 'IX'), 'XI': ('โ ช', 'โ ช', 'XI'), 'ffl': ('๏ฌ', '๏ฌ', '๏ฌl', 'f๏ฌ', 'ffl'), 'ffi': ('๏ฌ', '๏ฌ', '๏ฌi', 'f๏ฌ', 'ffi'), 'ff': ('๏ฌ', '๏ฌ', 'ff'), 'fi': ('๏ฌ', '๏ฌ', 'fi'), 'fl': ('๏ฌ', '๏ฌ', 'fl'), 'ij': ('ฤณ', 'ฤณ', 'ij'), 'lj': ('ว', 'ว', 'lj'), 'nj': ('ว', 'ว', 'nj'), 'dz': ('วณ', 'วณ', 'dz'), 'ii': ('โ ฑ', 'โ ฑ', 'ii'), 'iv': ('โ ณ', 'โ ณ', 'iv'), 'vi': ('โ ต', 'โ ต', 'vi'), 'ix': ('โ ธ', 'โ ธ', 'ix'), 'xi': ('โ บ', 'โ บ', 'xi'), } ligature_transformer = pp.one_of(ligature_map).add_parse_action( lambda t: random.choice(ligature_map[t[0]]) ) def make_mixed_font(t): # extract leading character and remainder to process separately t_first, t_rest = t[0][0], t[0][1:] # a leading '_' must be written using the ASCII character '_' ret = ['_' if t_first == '_' else random.choice(ident_char_map.get(t_first, t_first))] t_rest = ligature_transformer.transform_string(t_rest) ret.extend(random.choice(ident_char_map.get(c, c)) for c in t_rest) return ''.join(ret) # define a pyparsing expression to match any identifier; add a parse # action to convert to mixed Unicode characters identifier = pp.pyparsing_common.identifier identifier.add_parse_action(make_mixed_font) # match quoted strings (which may be f-strings) python_quoted_string = pp.Opt(pp.Char("fF")("f_string_prefix")) + ( pp.python_quoted_string )("quoted_string_body") def mix_fstring_expressions(t): if not t.f_string_prefix: return # define an expression and transformer to handle embedded # f-string field expressions fstring_arg = pp.QuotedString("{", end_quote_char="}") fstring_arg.add_parse_action( lambda tt: "{" + transformer.transform_string(tt[0]) + "}" ) return ( t.f_string_prefix + fstring_arg.transform_string(t.quoted_string_body) ) # add parse action to transform identifiers in f-strings python_quoted_string.add_parse_action(mix_fstring_expressions) # match keywords separately from identifiers - keywords must be kept in their # original ASCII any_keyword = pp.one_of( list(keyword.kwlist) + getattr(keyword, "softkwlist", []), as_keyword=True ) # quoted strings and keywords will be parsed, but left untransformed transformer = python_quoted_string | any_keyword | identifier def demo(): import textwrap hello_source = textwrap.dedent(""" def hello(): try: hello_ = "Hello" world_ = "World" print(f"{hello_}, {world_}!") except TypeError as exc: print("failed: {}".format(exc)) if __name__ == "__main__": hello() """) # use transformer to generate code with denormalized identifiers transformed = transformer.transform_string(hello_source) print(transformed) # does it really work? compile the transformed code and run it! code = compile(transformed, "inline source", mode="exec") exec(code) if 1: # pick some code from the stdlib import unittest.util as lib_module import inspect source = inspect.getsource(lib_module) transformed = transformer.transform_string(source) print() print(transformed) if __name__ == '__main__': demo()