ccxt-ir 4.3.46.0.1__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ccxt/__init__.py +358 -0
- ccxt/abantether.py +316 -0
- ccxt/abstract/__init__.py +0 -0
- ccxt/abstract/abantether.py +5 -0
- ccxt/abstract/ace.py +15 -0
- ccxt/abstract/afratether.py +6 -0
- ccxt/abstract/alpaca.py +70 -0
- ccxt/abstract/arzinja.py +5 -0
- ccxt/abstract/arzplus.py +7 -0
- ccxt/abstract/ascendex.py +77 -0
- ccxt/abstract/bequant.py +115 -0
- ccxt/abstract/bigone.py +45 -0
- ccxt/abstract/binance.py +712 -0
- ccxt/abstract/binancecoinm.py +712 -0
- ccxt/abstract/binanceus.py +764 -0
- ccxt/abstract/binanceusdm.py +712 -0
- ccxt/abstract/bingx.py +113 -0
- ccxt/abstract/bit2c.py +27 -0
- ccxt/abstract/bitbank.py +27 -0
- ccxt/abstract/bitbay.py +53 -0
- ccxt/abstract/bitbns.py +40 -0
- ccxt/abstract/bitcoincom.py +115 -0
- ccxt/abstract/bitfinex.py +69 -0
- ccxt/abstract/bitfinex2.py +139 -0
- ccxt/abstract/bitflyer.py +38 -0
- ccxt/abstract/bitget.py +508 -0
- ccxt/abstract/bithumb.py +32 -0
- ccxt/abstract/bitimen.py +7 -0
- ccxt/abstract/bitir.py +7 -0
- ccxt/abstract/bitmart.py +99 -0
- ccxt/abstract/bitmex.py +97 -0
- ccxt/abstract/bitopro.py +29 -0
- ccxt/abstract/bitpanda.py +35 -0
- ccxt/abstract/bitpin.py +7 -0
- ccxt/abstract/bitrue.py +72 -0
- ccxt/abstract/bitso.py +43 -0
- ccxt/abstract/bitstamp.py +258 -0
- ccxt/abstract/bitteam.py +29 -0
- ccxt/abstract/bitvavo.py +27 -0
- ccxt/abstract/bl3p.py +19 -0
- ccxt/abstract/blockchaincom.py +28 -0
- ccxt/abstract/blofin.py +37 -0
- ccxt/abstract/btcalpha.py +18 -0
- ccxt/abstract/btcbox.py +13 -0
- ccxt/abstract/btcmarkets.py +39 -0
- ccxt/abstract/btcturk.py +20 -0
- ccxt/abstract/bybit.py +298 -0
- ccxt/abstract/cex.py +33 -0
- ccxt/abstract/coinbase.py +94 -0
- ccxt/abstract/coinbaseadvanced.py +94 -0
- ccxt/abstract/coinbaseexchange.py +67 -0
- ccxt/abstract/coinbaseinternational.py +39 -0
- ccxt/abstract/coincatch.py +94 -0
- ccxt/abstract/coincheck.py +33 -0
- ccxt/abstract/coinex.py +237 -0
- ccxt/abstract/coinlist.py +54 -0
- ccxt/abstract/coinmate.py +62 -0
- ccxt/abstract/coinmetro.py +34 -0
- ccxt/abstract/coinone.py +67 -0
- ccxt/abstract/coinsph.py +54 -0
- ccxt/abstract/coinspot.py +28 -0
- ccxt/abstract/cryptocom.py +107 -0
- ccxt/abstract/currencycom.py +68 -0
- ccxt/abstract/delta.py +50 -0
- ccxt/abstract/deribit.py +125 -0
- ccxt/abstract/digifinex.py +91 -0
- ccxt/abstract/eterex.py +5 -0
- ccxt/abstract/excoino.py +7 -0
- ccxt/abstract/exir.py +8 -0
- ccxt/abstract/exmo.py +55 -0
- ccxt/abstract/exnovin.py +6 -0
- ccxt/abstract/farhadexchange.py +5 -0
- ccxt/abstract/fmfwio.py +115 -0
- ccxt/abstract/gate.py +265 -0
- ccxt/abstract/gateio.py +265 -0
- ccxt/abstract/gemini.py +58 -0
- ccxt/abstract/hashkey.py +67 -0
- ccxt/abstract/hitbtc.py +115 -0
- ccxt/abstract/hitbtc3.py +115 -0
- ccxt/abstract/hitobit.py +8 -0
- ccxt/abstract/hollaex.py +33 -0
- ccxt/abstract/htx.py +548 -0
- ccxt/abstract/huobi.py +548 -0
- ccxt/abstract/huobijp.py +114 -0
- ccxt/abstract/hyperliquid.py +6 -0
- ccxt/abstract/idex.py +26 -0
- ccxt/abstract/independentreserve.py +37 -0
- ccxt/abstract/indodax.py +26 -0
- ccxt/abstract/jibitex.py +7 -0
- ccxt/abstract/kraken.py +57 -0
- ccxt/abstract/krakenfutures.py +38 -0
- ccxt/abstract/kucoin.py +214 -0
- ccxt/abstract/kucoinfutures.py +233 -0
- ccxt/abstract/kuna.py +182 -0
- ccxt/abstract/latoken.py +56 -0
- ccxt/abstract/lbank.py +61 -0
- ccxt/abstract/luno.py +37 -0
- ccxt/abstract/lykke.py +29 -0
- ccxt/abstract/mercado.py +25 -0
- ccxt/abstract/mexc.py +178 -0
- ccxt/abstract/ndax.py +97 -0
- ccxt/abstract/nobitex.py +7 -0
- ccxt/abstract/novadax.py +29 -0
- ccxt/abstract/oceanex.py +22 -0
- ccxt/abstract/okcoin.py +74 -0
- ccxt/abstract/okexchange.py +8 -0
- ccxt/abstract/okx.py +324 -0
- ccxt/abstract/ompfinex.py +7 -0
- ccxt/abstract/onetrading.py +35 -0
- ccxt/abstract/oxfun.py +34 -0
- ccxt/abstract/p2b.py +22 -0
- ccxt/abstract/paradex.py +40 -0
- ccxt/abstract/paymium.py +28 -0
- ccxt/abstract/phemex.py +115 -0
- ccxt/abstract/poloniex.py +69 -0
- ccxt/abstract/poloniexfutures.py +48 -0
- ccxt/abstract/probit.py +23 -0
- ccxt/abstract/ramzinex.py +7 -0
- ccxt/abstract/sarmayex.py +5 -0
- ccxt/abstract/sarrafex.py +7 -0
- ccxt/abstract/tabdeal.py +7 -0
- ccxt/abstract/tetherland.py +5 -0
- ccxt/abstract/timex.py +62 -0
- ccxt/abstract/tokocrypto.py +37 -0
- ccxt/abstract/tradeogre.py +16 -0
- ccxt/abstract/twox.py +5 -0
- ccxt/abstract/ubitex.py +7 -0
- ccxt/abstract/upbit.py +38 -0
- ccxt/abstract/vertex.py +19 -0
- ccxt/abstract/wallex.py +8 -0
- ccxt/abstract/wavesexchange.py +154 -0
- ccxt/abstract/wazirx.py +30 -0
- ccxt/abstract/whitebit.py +98 -0
- ccxt/abstract/woo.py +83 -0
- ccxt/abstract/woofipro.py +119 -0
- ccxt/abstract/xt.py +152 -0
- ccxt/abstract/yobit.py +16 -0
- ccxt/abstract/zaif.py +38 -0
- ccxt/abstract/zonda.py +53 -0
- ccxt/ace.py +1012 -0
- ccxt/afratether.py +293 -0
- ccxt/alpaca.py +1083 -0
- ccxt/arzinja.py +285 -0
- ccxt/arzplus.py +412 -0
- ccxt/ascendex.py +3330 -0
- ccxt/async_support/__init__.py +337 -0
- ccxt/async_support/abantether.py +316 -0
- ccxt/async_support/ace.py +1012 -0
- ccxt/async_support/afratether.py +293 -0
- ccxt/async_support/alpaca.py +1083 -0
- ccxt/async_support/arzinja.py +285 -0
- ccxt/async_support/arzplus.py +412 -0
- ccxt/async_support/ascendex.py +3330 -0
- ccxt/async_support/base/__init__.py +1 -0
- ccxt/async_support/base/exchange.py +1966 -0
- ccxt/async_support/base/throttler.py +50 -0
- ccxt/async_support/base/ws/__init__.py +38 -0
- ccxt/async_support/base/ws/aiohttp_client.py +125 -0
- ccxt/async_support/base/ws/cache.py +212 -0
- ccxt/async_support/base/ws/client.py +193 -0
- ccxt/async_support/base/ws/fast_client.py +96 -0
- ccxt/async_support/base/ws/functions.py +59 -0
- ccxt/async_support/base/ws/future.py +58 -0
- ccxt/async_support/base/ws/order_book.py +78 -0
- ccxt/async_support/base/ws/order_book_side.py +174 -0
- ccxt/async_support/bequant.py +33 -0
- ccxt/async_support/bigone.py +2113 -0
- ccxt/async_support/binance.py +12234 -0
- ccxt/async_support/binancecoinm.py +45 -0
- ccxt/async_support/binanceus.py +211 -0
- ccxt/async_support/binanceusdm.py +58 -0
- ccxt/async_support/bingx.py +4325 -0
- ccxt/async_support/bit2c.py +866 -0
- ccxt/async_support/bitbank.py +1001 -0
- ccxt/async_support/bitbay.py +17 -0
- ccxt/async_support/bitbns.py +1154 -0
- ccxt/async_support/bitcoincom.py +17 -0
- ccxt/async_support/bitfinex.py +1617 -0
- ccxt/async_support/bitfinex2.py +3552 -0
- ccxt/async_support/bitflyer.py +995 -0
- ccxt/async_support/bitget.py +8273 -0
- ccxt/async_support/bithumb.py +1061 -0
- ccxt/async_support/bitimen.py +401 -0
- ccxt/async_support/bitir.py +490 -0
- ccxt/async_support/bitmart.py +4415 -0
- ccxt/async_support/bitmex.py +2756 -0
- ccxt/async_support/bitopro.py +1630 -0
- ccxt/async_support/bitpanda.py +16 -0
- ccxt/async_support/bitpin.py +454 -0
- ccxt/async_support/bitrue.py +3027 -0
- ccxt/async_support/bitso.py +1670 -0
- ccxt/async_support/bitstamp.py +2203 -0
- ccxt/async_support/bitteam.py +2239 -0
- ccxt/async_support/bitvavo.py +1968 -0
- ccxt/async_support/bl3p.py +485 -0
- ccxt/async_support/blockchaincom.py +1104 -0
- ccxt/async_support/blofin.py +2066 -0
- ccxt/async_support/btcalpha.py +891 -0
- ccxt/async_support/btcbox.py +544 -0
- ccxt/async_support/btcmarkets.py +1221 -0
- ccxt/async_support/btcturk.py +911 -0
- ccxt/async_support/bybit.py +8159 -0
- ccxt/async_support/cex.py +1605 -0
- ccxt/async_support/coinbase.py +4475 -0
- ccxt/async_support/coinbaseadvanced.py +17 -0
- ccxt/async_support/coinbaseexchange.py +1734 -0
- ccxt/async_support/coinbaseinternational.py +1899 -0
- ccxt/async_support/coincatch.py +5069 -0
- ccxt/async_support/coincheck.py +815 -0
- ccxt/async_support/coinex.py +5526 -0
- ccxt/async_support/coinlist.py +2243 -0
- ccxt/async_support/coinmate.py +1067 -0
- ccxt/async_support/coinmetro.py +1797 -0
- ccxt/async_support/coinone.py +1127 -0
- ccxt/async_support/coinsph.py +1850 -0
- ccxt/async_support/coinspot.py +534 -0
- ccxt/async_support/cryptocom.py +2822 -0
- ccxt/async_support/currencycom.py +1950 -0
- ccxt/async_support/delta.py +3376 -0
- ccxt/async_support/deribit.py +3437 -0
- ccxt/async_support/digifinex.py +3960 -0
- ccxt/async_support/eterex.py +286 -0
- ccxt/async_support/excoino.py +399 -0
- ccxt/async_support/exir.py +375 -0
- ccxt/async_support/exmo.py +2462 -0
- ccxt/async_support/exnovin.py +360 -0
- ccxt/async_support/farhadexchange.py +266 -0
- ccxt/async_support/fmfwio.py +34 -0
- ccxt/async_support/gate.py +6976 -0
- ccxt/async_support/gateio.py +16 -0
- ccxt/async_support/gemini.py +1825 -0
- ccxt/async_support/hashkey.py +4150 -0
- ccxt/async_support/hitbtc.py +3423 -0
- ccxt/async_support/hitbtc3.py +16 -0
- ccxt/async_support/hitobit.py +391 -0
- ccxt/async_support/hollaex.py +1813 -0
- ccxt/async_support/htx.py +8506 -0
- ccxt/async_support/huobi.py +16 -0
- ccxt/async_support/huobijp.py +1801 -0
- ccxt/async_support/hyperliquid.py +2431 -0
- ccxt/async_support/idex.py +1766 -0
- ccxt/async_support/independentreserve.py +784 -0
- ccxt/async_support/indodax.py +1247 -0
- ccxt/async_support/jibitex.py +395 -0
- ccxt/async_support/kraken.py +2894 -0
- ccxt/async_support/krakenfutures.py +2601 -0
- ccxt/async_support/kucoin.py +4602 -0
- ccxt/async_support/kucoinfutures.py +2698 -0
- ccxt/async_support/kuna.py +1841 -0
- ccxt/async_support/latoken.py +1664 -0
- ccxt/async_support/lbank.py +2683 -0
- ccxt/async_support/luno.py +1067 -0
- ccxt/async_support/lykke.py +1270 -0
- ccxt/async_support/mercado.py +842 -0
- ccxt/async_support/mexc.py +5369 -0
- ccxt/async_support/ndax.py +2354 -0
- ccxt/async_support/nobitex.py +419 -0
- ccxt/async_support/novadax.py +1484 -0
- ccxt/async_support/oceanex.py +903 -0
- ccxt/async_support/okcoin.py +2936 -0
- ccxt/async_support/okexchange.py +349 -0
- ccxt/async_support/okx.py +7827 -0
- ccxt/async_support/ompfinex.py +472 -0
- ccxt/async_support/onetrading.py +1911 -0
- ccxt/async_support/oxfun.py +2773 -0
- ccxt/async_support/p2b.py +1194 -0
- ccxt/async_support/paradex.py +2015 -0
- ccxt/async_support/paymium.py +564 -0
- ccxt/async_support/phemex.py +4473 -0
- ccxt/async_support/poloniex.py +2232 -0
- ccxt/async_support/poloniexfutures.py +1717 -0
- ccxt/async_support/probit.py +1734 -0
- ccxt/async_support/ramzinex.py +476 -0
- ccxt/async_support/sarmayex.py +357 -0
- ccxt/async_support/sarrafex.py +478 -0
- ccxt/async_support/tabdeal.py +364 -0
- ccxt/async_support/tetherland.py +349 -0
- ccxt/async_support/timex.py +1593 -0
- ccxt/async_support/tokocrypto.py +2405 -0
- ccxt/async_support/tradeogre.py +608 -0
- ccxt/async_support/twox.py +326 -0
- ccxt/async_support/ubitex.py +409 -0
- ccxt/async_support/upbit.py +1833 -0
- ccxt/async_support/vertex.py +2922 -0
- ccxt/async_support/wallex.py +445 -0
- ccxt/async_support/wavesexchange.py +2473 -0
- ccxt/async_support/wazirx.py +1224 -0
- ccxt/async_support/whitebit.py +2469 -0
- ccxt/async_support/woo.py +3114 -0
- ccxt/async_support/woofipro.py +2533 -0
- ccxt/async_support/xt.py +4454 -0
- ccxt/async_support/yobit.py +1283 -0
- ccxt/async_support/zaif.py +725 -0
- ccxt/async_support/zonda.py +1828 -0
- ccxt/base/__init__.py +27 -0
- ccxt/base/decimal_to_precision.py +174 -0
- ccxt/base/errors.py +242 -0
- ccxt/base/exchange.py +5941 -0
- ccxt/base/precise.py +287 -0
- ccxt/base/types.py +502 -0
- ccxt/bequant.py +33 -0
- ccxt/bigone.py +2112 -0
- ccxt/binance.py +12233 -0
- ccxt/binancecoinm.py +45 -0
- ccxt/binanceus.py +211 -0
- ccxt/binanceusdm.py +58 -0
- ccxt/bingx.py +4324 -0
- ccxt/bit2c.py +866 -0
- ccxt/bitbank.py +1001 -0
- ccxt/bitbay.py +17 -0
- ccxt/bitbns.py +1154 -0
- ccxt/bitcoincom.py +17 -0
- ccxt/bitfinex.py +1617 -0
- ccxt/bitfinex2.py +3552 -0
- ccxt/bitflyer.py +995 -0
- ccxt/bitget.py +8272 -0
- ccxt/bithumb.py +1061 -0
- ccxt/bitimen.py +401 -0
- ccxt/bitir.py +490 -0
- ccxt/bitmart.py +4415 -0
- ccxt/bitmex.py +2756 -0
- ccxt/bitopro.py +1630 -0
- ccxt/bitpanda.py +16 -0
- ccxt/bitpin.py +454 -0
- ccxt/bitrue.py +3026 -0
- ccxt/bitso.py +1670 -0
- ccxt/bitstamp.py +2203 -0
- ccxt/bitteam.py +2239 -0
- ccxt/bitvavo.py +1968 -0
- ccxt/bl3p.py +485 -0
- ccxt/blockchaincom.py +1104 -0
- ccxt/blofin.py +2066 -0
- ccxt/btcalpha.py +891 -0
- ccxt/btcbox.py +544 -0
- ccxt/btcmarkets.py +1221 -0
- ccxt/btcturk.py +911 -0
- ccxt/bybit.py +8158 -0
- ccxt/cex.py +1605 -0
- ccxt/coinbase.py +4474 -0
- ccxt/coinbaseadvanced.py +17 -0
- ccxt/coinbaseexchange.py +1734 -0
- ccxt/coinbaseinternational.py +1899 -0
- ccxt/coincatch.py +5069 -0
- ccxt/coincheck.py +815 -0
- ccxt/coinex.py +5525 -0
- ccxt/coinlist.py +2243 -0
- ccxt/coinmate.py +1067 -0
- ccxt/coinmetro.py +1797 -0
- ccxt/coinone.py +1127 -0
- ccxt/coinsph.py +1850 -0
- ccxt/coinspot.py +534 -0
- ccxt/cryptocom.py +2822 -0
- ccxt/currencycom.py +1950 -0
- ccxt/delta.py +3376 -0
- ccxt/deribit.py +3437 -0
- ccxt/digifinex.py +3959 -0
- ccxt/eterex.py +286 -0
- ccxt/excoino.py +399 -0
- ccxt/exir.py +375 -0
- ccxt/exmo.py +2462 -0
- ccxt/exnovin.py +360 -0
- ccxt/farhadexchange.py +266 -0
- ccxt/fmfwio.py +34 -0
- ccxt/gate.py +6975 -0
- ccxt/gateio.py +16 -0
- ccxt/gemini.py +1824 -0
- ccxt/hashkey.py +4150 -0
- ccxt/hitbtc.py +3423 -0
- ccxt/hitbtc3.py +16 -0
- ccxt/hitobit.py +391 -0
- ccxt/hollaex.py +1813 -0
- ccxt/htx.py +8505 -0
- ccxt/huobi.py +16 -0
- ccxt/huobijp.py +1801 -0
- ccxt/hyperliquid.py +2430 -0
- ccxt/idex.py +1766 -0
- ccxt/independentreserve.py +784 -0
- ccxt/indodax.py +1247 -0
- ccxt/jibitex.py +395 -0
- ccxt/kraken.py +2894 -0
- ccxt/krakenfutures.py +2601 -0
- ccxt/kucoin.py +4601 -0
- ccxt/kucoinfutures.py +2698 -0
- ccxt/kuna.py +1841 -0
- ccxt/latoken.py +1664 -0
- ccxt/lbank.py +2682 -0
- ccxt/luno.py +1067 -0
- ccxt/lykke.py +1270 -0
- ccxt/mercado.py +842 -0
- ccxt/mexc.py +5369 -0
- ccxt/ndax.py +2354 -0
- ccxt/nobitex.py +419 -0
- ccxt/novadax.py +1484 -0
- ccxt/oceanex.py +903 -0
- ccxt/okcoin.py +2936 -0
- ccxt/okexchange.py +349 -0
- ccxt/okx.py +7826 -0
- ccxt/ompfinex.py +472 -0
- ccxt/onetrading.py +1911 -0
- ccxt/oxfun.py +2772 -0
- ccxt/p2b.py +1194 -0
- ccxt/paradex.py +2015 -0
- ccxt/paymium.py +564 -0
- ccxt/phemex.py +4473 -0
- ccxt/poloniex.py +2232 -0
- ccxt/poloniexfutures.py +1717 -0
- ccxt/pro/__init__.py +149 -0
- ccxt/pro/alpaca.py +685 -0
- ccxt/pro/ascendex.py +916 -0
- ccxt/pro/bequant.py +38 -0
- ccxt/pro/binance.py +3488 -0
- ccxt/pro/binancecoinm.py +28 -0
- ccxt/pro/binanceus.py +48 -0
- ccxt/pro/binanceusdm.py +31 -0
- ccxt/pro/bingx.py +1264 -0
- ccxt/pro/bitcoincom.py +34 -0
- ccxt/pro/bitfinex.py +621 -0
- ccxt/pro/bitfinex2.py +1083 -0
- ccxt/pro/bitget.py +1692 -0
- ccxt/pro/bithumb.py +368 -0
- ccxt/pro/bitmart.py +1449 -0
- ccxt/pro/bitmex.py +1656 -0
- ccxt/pro/bitopro.py +445 -0
- ccxt/pro/bitpanda.py +15 -0
- ccxt/pro/bitrue.py +447 -0
- ccxt/pro/bitstamp.py +522 -0
- ccxt/pro/bitvavo.py +1270 -0
- ccxt/pro/blockchaincom.py +738 -0
- ccxt/pro/blofin.py +692 -0
- ccxt/pro/bybit.py +2000 -0
- ccxt/pro/cex.py +1440 -0
- ccxt/pro/coinbase.py +678 -0
- ccxt/pro/coinbaseadvanced.py +16 -0
- ccxt/pro/coinbaseexchange.py +895 -0
- ccxt/pro/coinbaseinternational.py +620 -0
- ccxt/pro/coincatch.py +1464 -0
- ccxt/pro/coincheck.py +199 -0
- ccxt/pro/coinex.py +1061 -0
- ccxt/pro/coinone.py +395 -0
- ccxt/pro/cryptocom.py +947 -0
- ccxt/pro/currencycom.py +536 -0
- ccxt/pro/deribit.py +892 -0
- ccxt/pro/exmo.py +629 -0
- ccxt/pro/gate.py +1416 -0
- ccxt/pro/gateio.py +15 -0
- ccxt/pro/gemini.py +865 -0
- ccxt/pro/hashkey.py +802 -0
- ccxt/pro/hitbtc.py +1216 -0
- ccxt/pro/hollaex.py +563 -0
- ccxt/pro/htx.py +2215 -0
- ccxt/pro/huobi.py +15 -0
- ccxt/pro/huobijp.py +570 -0
- ccxt/pro/hyperliquid.py +525 -0
- ccxt/pro/idex.py +672 -0
- ccxt/pro/independentreserve.py +270 -0
- ccxt/pro/kraken.py +1356 -0
- ccxt/pro/krakenfutures.py +1492 -0
- ccxt/pro/kucoin.py +1133 -0
- ccxt/pro/kucoinfutures.py +1081 -0
- ccxt/pro/lbank.py +843 -0
- ccxt/pro/luno.py +303 -0
- ccxt/pro/mexc.py +1122 -0
- ccxt/pro/ndax.py +506 -0
- ccxt/pro/okcoin.py +698 -0
- ccxt/pro/okx.py +1851 -0
- ccxt/pro/onetrading.py +1275 -0
- ccxt/pro/oxfun.py +950 -0
- ccxt/pro/p2b.py +419 -0
- ccxt/pro/paradex.py +352 -0
- ccxt/pro/phemex.py +1441 -0
- ccxt/pro/poloniex.py +1166 -0
- ccxt/pro/poloniexfutures.py +990 -0
- ccxt/pro/probit.py +551 -0
- ccxt/pro/upbit.py +520 -0
- ccxt/pro/vertex.py +943 -0
- ccxt/pro/wazirx.py +749 -0
- ccxt/pro/whitebit.py +864 -0
- ccxt/pro/woo.py +1078 -0
- ccxt/pro/woofipro.py +1183 -0
- ccxt/pro/xt.py +1067 -0
- ccxt/probit.py +1734 -0
- ccxt/ramzinex.py +476 -0
- ccxt/sarmayex.py +357 -0
- ccxt/sarrafex.py +478 -0
- ccxt/static_dependencies/__init__.py +1 -0
- ccxt/static_dependencies/ecdsa/__init__.py +14 -0
- ccxt/static_dependencies/ecdsa/_version.py +520 -0
- ccxt/static_dependencies/ecdsa/curves.py +56 -0
- ccxt/static_dependencies/ecdsa/der.py +221 -0
- ccxt/static_dependencies/ecdsa/ecdsa.py +310 -0
- ccxt/static_dependencies/ecdsa/ellipticcurve.py +197 -0
- ccxt/static_dependencies/ecdsa/keys.py +332 -0
- ccxt/static_dependencies/ecdsa/numbertheory.py +531 -0
- ccxt/static_dependencies/ecdsa/rfc6979.py +100 -0
- ccxt/static_dependencies/ecdsa/util.py +266 -0
- ccxt/static_dependencies/ethereum/__init__.py +7 -0
- ccxt/static_dependencies/ethereum/abi/__init__.py +16 -0
- ccxt/static_dependencies/ethereum/abi/abi.py +19 -0
- ccxt/static_dependencies/ethereum/abi/base.py +152 -0
- ccxt/static_dependencies/ethereum/abi/codec.py +217 -0
- ccxt/static_dependencies/ethereum/abi/constants.py +3 -0
- ccxt/static_dependencies/ethereum/abi/decoding.py +565 -0
- ccxt/static_dependencies/ethereum/abi/encoding.py +720 -0
- ccxt/static_dependencies/ethereum/abi/exceptions.py +139 -0
- ccxt/static_dependencies/ethereum/abi/grammar.py +443 -0
- ccxt/static_dependencies/ethereum/abi/packed.py +13 -0
- ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
- ccxt/static_dependencies/ethereum/abi/registry.py +643 -0
- ccxt/static_dependencies/ethereum/abi/tools/__init__.py +3 -0
- ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +230 -0
- ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
- ccxt/static_dependencies/ethereum/abi/utils/numeric.py +83 -0
- ccxt/static_dependencies/ethereum/abi/utils/padding.py +27 -0
- ccxt/static_dependencies/ethereum/abi/utils/string.py +19 -0
- ccxt/static_dependencies/ethereum/account/__init__.py +3 -0
- ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +4 -0
- ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +239 -0
- ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +40 -0
- ccxt/static_dependencies/ethereum/account/messages.py +263 -0
- ccxt/static_dependencies/ethereum/account/py.typed +0 -0
- ccxt/static_dependencies/ethereum/hexbytes/__init__.py +5 -0
- ccxt/static_dependencies/ethereum/hexbytes/_utils.py +54 -0
- ccxt/static_dependencies/ethereum/hexbytes/main.py +65 -0
- ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
- ccxt/static_dependencies/ethereum/typing/__init__.py +63 -0
- ccxt/static_dependencies/ethereum/typing/abi.py +6 -0
- ccxt/static_dependencies/ethereum/typing/bls.py +7 -0
- ccxt/static_dependencies/ethereum/typing/discovery.py +5 -0
- ccxt/static_dependencies/ethereum/typing/encoding.py +7 -0
- ccxt/static_dependencies/ethereum/typing/enums.py +17 -0
- ccxt/static_dependencies/ethereum/typing/ethpm.py +9 -0
- ccxt/static_dependencies/ethereum/typing/evm.py +20 -0
- ccxt/static_dependencies/ethereum/typing/networks.py +1122 -0
- ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
- ccxt/static_dependencies/ethereum/utils/__init__.py +115 -0
- ccxt/static_dependencies/ethereum/utils/abi.py +72 -0
- ccxt/static_dependencies/ethereum/utils/address.py +171 -0
- ccxt/static_dependencies/ethereum/utils/applicators.py +151 -0
- ccxt/static_dependencies/ethereum/utils/conversions.py +190 -0
- ccxt/static_dependencies/ethereum/utils/currency.py +107 -0
- ccxt/static_dependencies/ethereum/utils/curried/__init__.py +269 -0
- ccxt/static_dependencies/ethereum/utils/debug.py +20 -0
- ccxt/static_dependencies/ethereum/utils/decorators.py +132 -0
- ccxt/static_dependencies/ethereum/utils/encoding.py +6 -0
- ccxt/static_dependencies/ethereum/utils/exceptions.py +4 -0
- ccxt/static_dependencies/ethereum/utils/functional.py +75 -0
- ccxt/static_dependencies/ethereum/utils/hexadecimal.py +74 -0
- ccxt/static_dependencies/ethereum/utils/humanize.py +188 -0
- ccxt/static_dependencies/ethereum/utils/logging.py +159 -0
- ccxt/static_dependencies/ethereum/utils/module_loading.py +31 -0
- ccxt/static_dependencies/ethereum/utils/numeric.py +43 -0
- ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
- ccxt/static_dependencies/ethereum/utils/toolz.py +76 -0
- ccxt/static_dependencies/ethereum/utils/types.py +54 -0
- ccxt/static_dependencies/ethereum/utils/typing/__init__.py +18 -0
- ccxt/static_dependencies/ethereum/utils/typing/misc.py +14 -0
- ccxt/static_dependencies/ethereum/utils/units.py +31 -0
- ccxt/static_dependencies/keccak/__init__.py +3 -0
- ccxt/static_dependencies/keccak/keccak.py +197 -0
- ccxt/static_dependencies/lark/__init__.py +38 -0
- ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
- ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
- ccxt/static_dependencies/lark/ast_utils.py +59 -0
- ccxt/static_dependencies/lark/common.py +86 -0
- ccxt/static_dependencies/lark/exceptions.py +292 -0
- ccxt/static_dependencies/lark/grammar.py +130 -0
- ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
- ccxt/static_dependencies/lark/indenter.py +143 -0
- ccxt/static_dependencies/lark/lark.py +658 -0
- ccxt/static_dependencies/lark/lexer.py +678 -0
- ccxt/static_dependencies/lark/load_grammar.py +1428 -0
- ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
- ccxt/static_dependencies/lark/parser_frontends.py +257 -0
- ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
- ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
- ccxt/static_dependencies/lark/parsers/earley.py +314 -0
- ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
- ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
- ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
- ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
- ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
- ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
- ccxt/static_dependencies/lark/reconstruct.py +107 -0
- ccxt/static_dependencies/lark/tools/__init__.py +70 -0
- ccxt/static_dependencies/lark/tools/nearley.py +202 -0
- ccxt/static_dependencies/lark/tools/serialize.py +32 -0
- ccxt/static_dependencies/lark/tools/standalone.py +196 -0
- ccxt/static_dependencies/lark/tree.py +267 -0
- ccxt/static_dependencies/lark/tree_matcher.py +186 -0
- ccxt/static_dependencies/lark/tree_templates.py +180 -0
- ccxt/static_dependencies/lark/utils.py +343 -0
- ccxt/static_dependencies/lark/visitors.py +596 -0
- ccxt/static_dependencies/marshmallow/__init__.py +81 -0
- ccxt/static_dependencies/marshmallow/base.py +65 -0
- ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
- ccxt/static_dependencies/marshmallow/decorators.py +231 -0
- ccxt/static_dependencies/marshmallow/error_store.py +60 -0
- ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
- ccxt/static_dependencies/marshmallow/fields.py +2114 -0
- ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
- ccxt/static_dependencies/marshmallow/schema.py +1228 -0
- ccxt/static_dependencies/marshmallow/types.py +12 -0
- ccxt/static_dependencies/marshmallow/utils.py +378 -0
- ccxt/static_dependencies/marshmallow/validate.py +678 -0
- ccxt/static_dependencies/marshmallow/warnings.py +2 -0
- ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
- ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
- ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
- ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
- ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
- ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
- ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
- ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
- ccxt/static_dependencies/msgpack/__init__.py +55 -0
- ccxt/static_dependencies/msgpack/exceptions.py +48 -0
- ccxt/static_dependencies/msgpack/ext.py +168 -0
- ccxt/static_dependencies/msgpack/fallback.py +951 -0
- ccxt/static_dependencies/parsimonious/__init__.py +10 -0
- ccxt/static_dependencies/parsimonious/exceptions.py +105 -0
- ccxt/static_dependencies/parsimonious/expressions.py +479 -0
- ccxt/static_dependencies/parsimonious/grammar.py +487 -0
- ccxt/static_dependencies/parsimonious/nodes.py +325 -0
- ccxt/static_dependencies/parsimonious/utils.py +40 -0
- ccxt/static_dependencies/starknet/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
- ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
- ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
- ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
- ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
- ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
- ccxt/static_dependencies/starknet/common.py +15 -0
- ccxt/static_dependencies/starknet/constants.py +39 -0
- ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
- ccxt/static_dependencies/starknet/hash/address.py +79 -0
- ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
- ccxt/static_dependencies/starknet/hash/selector.py +16 -0
- ccxt/static_dependencies/starknet/hash/storage.py +12 -0
- ccxt/static_dependencies/starknet/hash/utils.py +78 -0
- ccxt/static_dependencies/starknet/models/__init__.py +0 -0
- ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
- ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
- ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
- ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
- ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
- ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
- ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
- ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
- ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
- ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
- ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
- ccxt/static_dependencies/starknet/utils/schema.py +13 -0
- ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
- ccxt/static_dependencies/starkware/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
- ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
- ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
- ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
- ccxt/static_dependencies/sympy/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
- ccxt/static_dependencies/sympy/external/__init__.py +0 -0
- ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
- ccxt/static_dependencies/sympy/external/importtools.py +187 -0
- ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
- ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
- ccxt/static_dependencies/toolz/__init__.py +26 -0
- ccxt/static_dependencies/toolz/_signatures.py +784 -0
- ccxt/static_dependencies/toolz/_version.py +520 -0
- ccxt/static_dependencies/toolz/compatibility.py +30 -0
- ccxt/static_dependencies/toolz/curried/__init__.py +101 -0
- ccxt/static_dependencies/toolz/curried/exceptions.py +22 -0
- ccxt/static_dependencies/toolz/curried/operator.py +22 -0
- ccxt/static_dependencies/toolz/dicttoolz.py +339 -0
- ccxt/static_dependencies/toolz/functoolz.py +1049 -0
- ccxt/static_dependencies/toolz/itertoolz.py +1057 -0
- ccxt/static_dependencies/toolz/recipes.py +46 -0
- ccxt/static_dependencies/toolz/utils.py +9 -0
- ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
- ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
- ccxt/tabdeal.py +364 -0
- ccxt/test/__init__.py +3 -0
- ccxt/test/base/__init__.py +29 -0
- ccxt/test/base/test_account.py +26 -0
- ccxt/test/base/test_balance.py +56 -0
- ccxt/test/base/test_borrow_interest.py +35 -0
- ccxt/test/base/test_borrow_rate.py +32 -0
- ccxt/test/base/test_calculate_fee.py +51 -0
- ccxt/test/base/test_crypto.py +127 -0
- ccxt/test/base/test_currency.py +76 -0
- ccxt/test/base/test_datetime.py +109 -0
- ccxt/test/base/test_decimal_to_precision.py +392 -0
- ccxt/test/base/test_deep_extend.py +68 -0
- ccxt/test/base/test_deposit_withdrawal.py +50 -0
- ccxt/test/base/test_exchange_datetime_functions.py +76 -0
- ccxt/test/base/test_funding_rate_history.py +29 -0
- ccxt/test/base/test_last_price.py +31 -0
- ccxt/test/base/test_ledger_entry.py +45 -0
- ccxt/test/base/test_ledger_item.py +48 -0
- ccxt/test/base/test_leverage_tier.py +33 -0
- ccxt/test/base/test_liquidation.py +50 -0
- ccxt/test/base/test_margin_mode.py +24 -0
- ccxt/test/base/test_margin_modification.py +35 -0
- ccxt/test/base/test_market.py +193 -0
- ccxt/test/base/test_number.py +411 -0
- ccxt/test/base/test_ohlcv.py +33 -0
- ccxt/test/base/test_open_interest.py +32 -0
- ccxt/test/base/test_order.py +64 -0
- ccxt/test/base/test_order_book.py +69 -0
- ccxt/test/base/test_position.py +60 -0
- ccxt/test/base/test_shared_methods.py +353 -0
- ccxt/test/base/test_status.py +24 -0
- ccxt/test/base/test_throttle.py +126 -0
- ccxt/test/base/test_ticker.py +92 -0
- ccxt/test/base/test_trade.py +47 -0
- ccxt/test/base/test_trading_fee.py +26 -0
- ccxt/test/base/test_transaction.py +39 -0
- ccxt/test/test_async.py +1649 -0
- ccxt/test/test_sync.py +1648 -0
- ccxt/test/tests_async.py +1558 -0
- ccxt/test/tests_helpers.py +287 -0
- ccxt/test/tests_init.py +39 -0
- ccxt/test/tests_sync.py +1555 -0
- ccxt/tetherland.py +349 -0
- ccxt/timex.py +1593 -0
- ccxt/tokocrypto.py +2405 -0
- ccxt/tradeogre.py +608 -0
- ccxt/twox.py +326 -0
- ccxt/ubitex.py +409 -0
- ccxt/upbit.py +1833 -0
- ccxt/vertex.py +2922 -0
- ccxt/wallex.py +445 -0
- ccxt/wavesexchange.py +2472 -0
- ccxt/wazirx.py +1224 -0
- ccxt/whitebit.py +2469 -0
- ccxt/woo.py +3114 -0
- ccxt/woofipro.py +2533 -0
- ccxt/xt.py +4453 -0
- ccxt/yobit.py +1283 -0
- ccxt/zaif.py +725 -0
- ccxt/zonda.py +1828 -0
- ccxt_ir-4.3.46.0.1.dist-info/LICENSE.txt +21 -0
- ccxt_ir-4.3.46.0.1.dist-info/METADATA +655 -0
- ccxt_ir-4.3.46.0.1.dist-info/RECORD +772 -0
- ccxt_ir-4.3.46.0.1.dist-info/WHEEL +6 -0
- ccxt_ir-4.3.46.0.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
"""Nodes that make up parse trees
|
|
2
|
+
|
|
3
|
+
Parsing spits out a tree of these, which you can then tell to walk itself and
|
|
4
|
+
spit out a useful value. Or you can walk it yourself; the structural attributes
|
|
5
|
+
are public.
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
# TODO: If this is slow, think about using cElementTree or something.
|
|
9
|
+
from inspect import isfunction
|
|
10
|
+
from sys import version_info, exc_info
|
|
11
|
+
|
|
12
|
+
from .exceptions import VisitationError, UndefinedLabel
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Node(object):
|
|
16
|
+
"""A parse tree node
|
|
17
|
+
|
|
18
|
+
Consider these immutable once constructed. As a side effect of a
|
|
19
|
+
memory-saving strategy in the cache, multiple references to a single
|
|
20
|
+
``Node`` might be returned in a single parse tree. So, if you start
|
|
21
|
+
messing with one, you'll see surprising parallel changes pop up elsewhere.
|
|
22
|
+
|
|
23
|
+
My philosophy is that parse trees (and their nodes) should be
|
|
24
|
+
representation-agnostic. That is, they shouldn't get all mixed up with what
|
|
25
|
+
the final rendered form of a wiki page (or the intermediate representation
|
|
26
|
+
of a programming language, or whatever) is going to be: you should be able
|
|
27
|
+
to parse once and render several representations from the tree, one after
|
|
28
|
+
another.
|
|
29
|
+
|
|
30
|
+
"""
|
|
31
|
+
# I tried making this subclass list, but it got ugly. I had to construct
|
|
32
|
+
# invalid ones and patch them up later, and there were other problems.
|
|
33
|
+
__slots__ = ['expr', # The expression that generated me
|
|
34
|
+
'full_text', # The full text fed to the parser
|
|
35
|
+
'start', # The position in the text where that expr started matching
|
|
36
|
+
'end', # The position after start where the expr first didn't
|
|
37
|
+
# match. [start:end] follow Python slice conventions.
|
|
38
|
+
'children'] # List of child parse tree nodes
|
|
39
|
+
|
|
40
|
+
def __init__(self, expr, full_text, start, end, children=None):
|
|
41
|
+
self.expr = expr
|
|
42
|
+
self.full_text = full_text
|
|
43
|
+
self.start = start
|
|
44
|
+
self.end = end
|
|
45
|
+
self.children = children or []
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def expr_name(self):
|
|
49
|
+
# backwards compatibility
|
|
50
|
+
return self.expr.name
|
|
51
|
+
|
|
52
|
+
def __iter__(self):
|
|
53
|
+
"""Support looping over my children and doing tuple unpacks on me.
|
|
54
|
+
|
|
55
|
+
It can be very handy to unpack nodes in arg lists; see
|
|
56
|
+
:class:`PegVisitor` for an example.
|
|
57
|
+
|
|
58
|
+
"""
|
|
59
|
+
return iter(self.children)
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def text(self):
|
|
63
|
+
"""Return the text this node matched."""
|
|
64
|
+
return self.full_text[self.start:self.end]
|
|
65
|
+
|
|
66
|
+
# From here down is just stuff for testing and debugging.
|
|
67
|
+
|
|
68
|
+
def prettily(self, error=None):
|
|
69
|
+
"""Return a unicode, pretty-printed representation of me.
|
|
70
|
+
|
|
71
|
+
:arg error: The node to highlight because an error occurred there
|
|
72
|
+
|
|
73
|
+
"""
|
|
74
|
+
# TODO: If a Node appears multiple times in the tree, we'll point to
|
|
75
|
+
# them all. Whoops.
|
|
76
|
+
def indent(text):
|
|
77
|
+
return '\n'.join((' ' + line) for line in text.splitlines())
|
|
78
|
+
ret = [u'<%s%s matching "%s">%s' % (
|
|
79
|
+
self.__class__.__name__,
|
|
80
|
+
(' called "%s"' % self.expr_name) if self.expr_name else '',
|
|
81
|
+
self.text,
|
|
82
|
+
' <-- *** We were here. ***' if error is self else '')]
|
|
83
|
+
for n in self:
|
|
84
|
+
ret.append(indent(n.prettily(error=error)))
|
|
85
|
+
return '\n'.join(ret)
|
|
86
|
+
|
|
87
|
+
def __str__(self):
|
|
88
|
+
"""Return a compact, human-readable representation of me."""
|
|
89
|
+
return self.prettily()
|
|
90
|
+
|
|
91
|
+
def __eq__(self, other):
|
|
92
|
+
"""Support by-value deep comparison with other nodes for testing."""
|
|
93
|
+
if not isinstance(other, Node):
|
|
94
|
+
return NotImplemented
|
|
95
|
+
|
|
96
|
+
return (self.expr == other.expr and
|
|
97
|
+
self.full_text == other.full_text and
|
|
98
|
+
self.start == other.start and
|
|
99
|
+
self.end == other.end and
|
|
100
|
+
self.children == other.children)
|
|
101
|
+
|
|
102
|
+
def __ne__(self, other):
|
|
103
|
+
return not self == other
|
|
104
|
+
|
|
105
|
+
def __repr__(self, top_level=True):
|
|
106
|
+
"""Return a bit of code (though not an expression) that will recreate
|
|
107
|
+
me."""
|
|
108
|
+
# repr() of unicode flattens everything out to ASCII, so we don't need
|
|
109
|
+
# to explicitly encode things afterward.
|
|
110
|
+
ret = ["s = %r" % self.full_text] if top_level else []
|
|
111
|
+
ret.append("%s(%r, s, %s, %s%s)" % (
|
|
112
|
+
self.__class__.__name__,
|
|
113
|
+
self.expr,
|
|
114
|
+
self.start,
|
|
115
|
+
self.end,
|
|
116
|
+
(', children=[%s]' %
|
|
117
|
+
', '.join([c.__repr__(top_level=False) for c in self.children]))
|
|
118
|
+
if self.children else ''))
|
|
119
|
+
return '\n'.join(ret)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class RegexNode(Node):
|
|
123
|
+
"""Node returned from a ``Regex`` expression
|
|
124
|
+
|
|
125
|
+
Grants access to the ``re.Match`` object, in case you want to access
|
|
126
|
+
capturing groups, etc.
|
|
127
|
+
|
|
128
|
+
"""
|
|
129
|
+
__slots__ = ['match']
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class RuleDecoratorMeta(type):
|
|
133
|
+
def __new__(metaclass, name, bases, namespace):
|
|
134
|
+
def unvisit(name):
|
|
135
|
+
"""Remove any leading "visit_" from a method name."""
|
|
136
|
+
return name[6:] if name.startswith('visit_') else name
|
|
137
|
+
|
|
138
|
+
methods = [v for k, v in namespace.items() if
|
|
139
|
+
hasattr(v, '_rule') and isfunction(v)]
|
|
140
|
+
if methods:
|
|
141
|
+
from .grammar import Grammar # circular import dodge
|
|
142
|
+
|
|
143
|
+
methods.sort(key=(lambda x: x.func_code.co_firstlineno)
|
|
144
|
+
if version_info[0] < 3 else
|
|
145
|
+
(lambda x: x.__code__.co_firstlineno))
|
|
146
|
+
# Possible enhancement: once we get the Grammar extensibility story
|
|
147
|
+
# solidified, we can have @rules *add* to the default grammar
|
|
148
|
+
# rather than pave over it.
|
|
149
|
+
namespace['grammar'] = Grammar(
|
|
150
|
+
'\n'.join('{name} = {expr}'.format(name=unvisit(m.__name__),
|
|
151
|
+
expr=m._rule)
|
|
152
|
+
for m in methods))
|
|
153
|
+
return super(RuleDecoratorMeta,
|
|
154
|
+
metaclass).__new__(metaclass, name, bases, namespace)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class NodeVisitor(object, metaclass=RuleDecoratorMeta):
|
|
158
|
+
"""A shell for writing things that turn parse trees into something useful
|
|
159
|
+
|
|
160
|
+
Performs a depth-first traversal of an AST. Subclass this, add methods for
|
|
161
|
+
each expr you care about, instantiate, and call
|
|
162
|
+
``visit(top_node_of_parse_tree)``. It'll return the useful stuff. This API
|
|
163
|
+
is very similar to that of ``ast.NodeVisitor``.
|
|
164
|
+
|
|
165
|
+
These could easily all be static methods, but that would add at least as
|
|
166
|
+
much weirdness at the call site as the ``()`` for instantiation. And this
|
|
167
|
+
way, we support subclasses that require state: options, for example, or a
|
|
168
|
+
symbol table constructed from a programming language's AST.
|
|
169
|
+
|
|
170
|
+
We never transform the parse tree in place, because...
|
|
171
|
+
|
|
172
|
+
* There are likely multiple references to the same ``Node`` object in a
|
|
173
|
+
parse tree, and changes to one reference would surprise you elsewhere.
|
|
174
|
+
* It makes it impossible to report errors: you'd end up with the "error"
|
|
175
|
+
arrow pointing someplace in a half-transformed mishmash of nodes--and
|
|
176
|
+
that's assuming you're even transforming the tree into another tree.
|
|
177
|
+
Heaven forbid you're making it into a string or something else.
|
|
178
|
+
|
|
179
|
+
"""
|
|
180
|
+
|
|
181
|
+
#: The :term:`default grammar`: the one recommended for use with this
|
|
182
|
+
#: visitor. If you populate this, you will be able to call
|
|
183
|
+
#: :meth:`NodeVisitor.parse()` as a shortcut.
|
|
184
|
+
grammar = None
|
|
185
|
+
|
|
186
|
+
#: Classes of exceptions you actually intend to raise during visitation
|
|
187
|
+
#: and which should propagate out of the visitor. These will not be
|
|
188
|
+
#: wrapped in a VisitationError when they arise.
|
|
189
|
+
unwrapped_exceptions = ()
|
|
190
|
+
|
|
191
|
+
# TODO: If we need to optimize this, we can go back to putting subclasses
|
|
192
|
+
# in charge of visiting children; they know when not to bother. Or we can
|
|
193
|
+
# mark nodes as not descent-worthy in the grammar.
|
|
194
|
+
def visit(self, node):
|
|
195
|
+
"""Walk a parse tree, transforming it into another representation.
|
|
196
|
+
|
|
197
|
+
Recursively descend a parse tree, dispatching to the method named after
|
|
198
|
+
the rule in the :class:`~.grammar.Grammar` that produced
|
|
199
|
+
each node. If, for example, a rule was... ::
|
|
200
|
+
|
|
201
|
+
bold = '<b>'
|
|
202
|
+
|
|
203
|
+
...the ``visit_bold()`` method would be called. It is your
|
|
204
|
+
responsibility to subclass :class:`NodeVisitor` and implement those
|
|
205
|
+
methods.
|
|
206
|
+
|
|
207
|
+
"""
|
|
208
|
+
method = getattr(self, 'visit_' + node.expr_name, self.generic_visit)
|
|
209
|
+
|
|
210
|
+
# Call that method, and show where in the tree it failed if it blows
|
|
211
|
+
# up.
|
|
212
|
+
try:
|
|
213
|
+
return method(node, [self.visit(n) for n in node])
|
|
214
|
+
except (VisitationError, UndefinedLabel):
|
|
215
|
+
# Don't catch and re-wrap already-wrapped exceptions.
|
|
216
|
+
raise
|
|
217
|
+
except Exception as exc:
|
|
218
|
+
# implentors may define exception classes that should not be
|
|
219
|
+
# wrapped.
|
|
220
|
+
if isinstance(exc, self.unwrapped_exceptions):
|
|
221
|
+
raise
|
|
222
|
+
# Catch any exception, and tack on a parse tree so it's easier to
|
|
223
|
+
# see where it went wrong.
|
|
224
|
+
exc_class = type(exc)
|
|
225
|
+
raise VisitationError(exc, exc_class, node)
|
|
226
|
+
|
|
227
|
+
def generic_visit(self, node, visited_children):
|
|
228
|
+
"""Default visitor method
|
|
229
|
+
|
|
230
|
+
:arg node: The node we're visiting
|
|
231
|
+
:arg visited_children: The results of visiting the children of that
|
|
232
|
+
node, in a list
|
|
233
|
+
|
|
234
|
+
I'm not sure there's an implementation of this that makes sense across
|
|
235
|
+
all (or even most) use cases, so we leave it to subclasses to implement
|
|
236
|
+
for now.
|
|
237
|
+
|
|
238
|
+
"""
|
|
239
|
+
raise NotImplementedError('No visitor method was defined for this expression: %s' %
|
|
240
|
+
node.expr.as_rule())
|
|
241
|
+
|
|
242
|
+
# Convenience methods:
|
|
243
|
+
|
|
244
|
+
def parse(self, text, pos=0):
|
|
245
|
+
"""Parse some text with this Visitor's default grammar and return the
|
|
246
|
+
result of visiting it.
|
|
247
|
+
|
|
248
|
+
``SomeVisitor().parse('some_string')`` is a shortcut for
|
|
249
|
+
``SomeVisitor().visit(some_grammar.parse('some_string'))``.
|
|
250
|
+
|
|
251
|
+
"""
|
|
252
|
+
return self._parse_or_match(text, pos, 'parse')
|
|
253
|
+
|
|
254
|
+
def match(self, text, pos=0):
|
|
255
|
+
"""Parse and visit some text with this Visitor's default grammar, but
|
|
256
|
+
don't insist on parsing all the way to the end.
|
|
257
|
+
|
|
258
|
+
``SomeVisitor().match('some_string')`` is a shortcut for
|
|
259
|
+
``SomeVisitor().visit(some_grammar.match('some_string'))``.
|
|
260
|
+
|
|
261
|
+
"""
|
|
262
|
+
return self._parse_or_match(text, pos, 'match')
|
|
263
|
+
|
|
264
|
+
# Internal convenience methods to help you write your own visitors:
|
|
265
|
+
|
|
266
|
+
def lift_child(self, node, children):
|
|
267
|
+
"""Lift the sole child of ``node`` up to replace the node."""
|
|
268
|
+
first_child, = children
|
|
269
|
+
return first_child
|
|
270
|
+
|
|
271
|
+
# Private methods:
|
|
272
|
+
|
|
273
|
+
def _parse_or_match(self, text, pos, method_name):
|
|
274
|
+
"""Execute a parse or match on the default grammar, followed by a
|
|
275
|
+
visitation.
|
|
276
|
+
|
|
277
|
+
Raise RuntimeError if there is no default grammar specified.
|
|
278
|
+
|
|
279
|
+
"""
|
|
280
|
+
if not self.grammar:
|
|
281
|
+
raise RuntimeError(
|
|
282
|
+
"The {cls}.{method}() shortcut won't work because {cls} was "
|
|
283
|
+
"never associated with a specific " "grammar. Fill out its "
|
|
284
|
+
"`grammar` attribute, and try again.".format(
|
|
285
|
+
cls=self.__class__.__name__,
|
|
286
|
+
method=method_name))
|
|
287
|
+
return self.visit(getattr(self.grammar, method_name)(text, pos=pos))
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
def rule(rule_string):
|
|
291
|
+
"""Decorate a NodeVisitor ``visit_*`` method to tie a grammar rule to it.
|
|
292
|
+
|
|
293
|
+
The following will arrange for the ``visit_digit`` method to receive the
|
|
294
|
+
results of the ``~"[0-9]"`` parse rule::
|
|
295
|
+
|
|
296
|
+
@rule('~"[0-9]"')
|
|
297
|
+
def visit_digit(self, node, visited_children):
|
|
298
|
+
...
|
|
299
|
+
|
|
300
|
+
Notice that there is no "digit = " as part of the rule; that gets inferred
|
|
301
|
+
from the method name.
|
|
302
|
+
|
|
303
|
+
In cases where there is only one kind of visitor interested in a grammar,
|
|
304
|
+
using ``@rule`` saves you having to look back and forth between the visitor
|
|
305
|
+
and the grammar definition.
|
|
306
|
+
|
|
307
|
+
On an implementation level, all ``@rule`` rules get stitched together into
|
|
308
|
+
a :class:`~.Grammar` that becomes the NodeVisitor's
|
|
309
|
+
:term:`default grammar`.
|
|
310
|
+
|
|
311
|
+
Typically, the choice of a default rule for this grammar is simple: whatever
|
|
312
|
+
``@rule`` comes first in the class is the default. But the choice may become
|
|
313
|
+
surprising if you divide the ``@rule`` calls among subclasses. At the
|
|
314
|
+
moment, which method "comes first" is decided simply by comparing line
|
|
315
|
+
numbers, so whatever method is on the smallest-numbered line will be the
|
|
316
|
+
default. In a future release, this will change to pick the
|
|
317
|
+
first ``@rule`` call on the basemost class that has one. That way, a
|
|
318
|
+
subclass which does not override the default rule's ``visit_*`` method
|
|
319
|
+
won't unintentionally change which rule is the default.
|
|
320
|
+
|
|
321
|
+
"""
|
|
322
|
+
def decorator(method):
|
|
323
|
+
method._rule = rule_string # XXX: Maybe register them on a class var instead so we can just override a @rule'd visitor method on a subclass without blowing away the rule string that comes with it.
|
|
324
|
+
return method
|
|
325
|
+
return decorator
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""General tools which don't depend on other parts of Parsimonious"""
|
|
2
|
+
|
|
3
|
+
import ast
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class StrAndRepr(object):
|
|
7
|
+
"""Mix-in which gives the class the same __repr__ and __str__."""
|
|
8
|
+
|
|
9
|
+
def __repr__(self):
|
|
10
|
+
return self.__str__()
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def evaluate_string(string):
|
|
14
|
+
"""Piggyback on Python's string support so we can have backslash escaping
|
|
15
|
+
and niceties like \n, \t, etc. string.decode('string_escape') would have
|
|
16
|
+
been a lower-level possibility.
|
|
17
|
+
|
|
18
|
+
"""
|
|
19
|
+
return ast.literal_eval(string)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Token(StrAndRepr):
|
|
23
|
+
"""A class to represent tokens, for use with TokenGrammars
|
|
24
|
+
|
|
25
|
+
You will likely want to subclass this to hold additional information, like
|
|
26
|
+
the characters that you lexed to create this token. Alternately, feel free
|
|
27
|
+
to create your own class from scratch. The only contract is that tokens
|
|
28
|
+
must have a ``type`` attr.
|
|
29
|
+
|
|
30
|
+
"""
|
|
31
|
+
__slots__ = ['type']
|
|
32
|
+
|
|
33
|
+
def __init__(self, type):
|
|
34
|
+
self.type = type
|
|
35
|
+
|
|
36
|
+
def __str__(self):
|
|
37
|
+
return u'<Token "%s">' % (self.type,)
|
|
38
|
+
|
|
39
|
+
def __eq__(self, other):
|
|
40
|
+
return self.type == other.type
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from abc import ABC
|
|
4
|
+
from collections import OrderedDict
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import List
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class CairoType(ABC):
|
|
10
|
+
"""
|
|
11
|
+
Base type for all Cairo type representations. All types extend it.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class FeltType(CairoType):
|
|
17
|
+
"""
|
|
18
|
+
Type representation of Cairo field element.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class BoolType(CairoType):
|
|
24
|
+
"""
|
|
25
|
+
Type representation of Cairo boolean.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class TupleType(CairoType):
|
|
31
|
+
"""
|
|
32
|
+
Type representation of Cairo tuples without named fields.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
types: List[CairoType] #: types of every tuple element.
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass
|
|
39
|
+
class NamedTupleType(CairoType):
|
|
40
|
+
"""
|
|
41
|
+
Type representation of Cairo tuples with named fields.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
types: OrderedDict[str, CairoType] #: types of every tuple member.
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@dataclass
|
|
48
|
+
class ArrayType(CairoType):
|
|
49
|
+
"""
|
|
50
|
+
Type representation of Cairo arrays.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
inner_type: CairoType #: type of element inside array.
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class StructType(CairoType):
|
|
58
|
+
"""
|
|
59
|
+
Type representation of Cairo structures.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
name: str #: Structure name
|
|
63
|
+
# We need ordered dict, because it is important in serialization
|
|
64
|
+
types: OrderedDict[str, CairoType] #: types of every structure member.
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@dataclass
|
|
68
|
+
class EnumType(CairoType):
|
|
69
|
+
"""
|
|
70
|
+
Type representation of Cairo enums.
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
name: str
|
|
74
|
+
variants: OrderedDict[str, CairoType]
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@dataclass
|
|
78
|
+
class OptionType(CairoType):
|
|
79
|
+
"""
|
|
80
|
+
Type representation of Cairo options.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
type: CairoType
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@dataclass
|
|
87
|
+
class UintType(CairoType):
|
|
88
|
+
"""
|
|
89
|
+
Type representation of Cairo unsigned integers.
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
bits: int
|
|
93
|
+
|
|
94
|
+
def check_range(self, value: int):
|
|
95
|
+
"""
|
|
96
|
+
Utility method checking if the `value` is in range.
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@dataclass
|
|
101
|
+
class TypeIdentifier(CairoType):
|
|
102
|
+
"""
|
|
103
|
+
Type representation of Cairo identifiers.
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
name: str
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@dataclass
|
|
110
|
+
class UnitType(CairoType):
|
|
111
|
+
"""
|
|
112
|
+
Type representation of Cairo unit `()`.
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
@dataclass
|
|
117
|
+
class EventType(CairoType):
|
|
118
|
+
"""
|
|
119
|
+
Type representation of Cairo Event.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
name: str
|
|
123
|
+
types: OrderedDict[str, CairoType]
|
|
File without changes
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import dataclasses
|
|
2
|
+
from typing import List, Optional
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class CairoType:
|
|
6
|
+
"""
|
|
7
|
+
Base class for cairo types.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclasses.dataclass
|
|
12
|
+
class TypeFelt(CairoType):
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclasses.dataclass
|
|
17
|
+
class TypeCodeoffset(CairoType):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclasses.dataclass
|
|
22
|
+
class TypePointer(CairoType):
|
|
23
|
+
pointee: CairoType
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclasses.dataclass
|
|
27
|
+
class TypeIdentifier(CairoType):
|
|
28
|
+
"""
|
|
29
|
+
Represents a name of an unresolved type.
|
|
30
|
+
This type can be resolved to TypeStruct or TypeDefinition.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
name: str
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclasses.dataclass
|
|
37
|
+
class TypeStruct(CairoType):
|
|
38
|
+
scope: str
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclasses.dataclass
|
|
42
|
+
class TypeFunction(CairoType):
|
|
43
|
+
"""
|
|
44
|
+
Represents a type of a function.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
scope: str
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@dataclasses.dataclass
|
|
51
|
+
class TypeTuple(CairoType):
|
|
52
|
+
"""
|
|
53
|
+
Represents a type of a named or unnamed tuple.
|
|
54
|
+
For example, "(felt, felt*)" or "(a: felt, b: felt*)".
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
@dataclasses.dataclass
|
|
58
|
+
class Item(CairoType):
|
|
59
|
+
"""
|
|
60
|
+
Represents a possibly named type item of a TypeTuple.
|
|
61
|
+
For example: "felt" or "a: felt".
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
name: Optional[str]
|
|
65
|
+
typ: CairoType
|
|
66
|
+
|
|
67
|
+
members: List["TypeTuple.Item"]
|
|
68
|
+
has_trailing_comma: bool = dataclasses.field(hash=False, compare=False)
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def is_named(self) -> bool:
|
|
72
|
+
return all(member.name is not None for member in self.members)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@dataclasses.dataclass
|
|
76
|
+
class ExprIdentifier(CairoType):
|
|
77
|
+
name: str
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from ....lark import Lark
|
|
2
|
+
|
|
3
|
+
from .cairo_types import CairoType
|
|
4
|
+
from .parser_transformer import ParserTransformer
|
|
5
|
+
|
|
6
|
+
CAIRO_EBNF = """
|
|
7
|
+
%import common.WS_INLINE
|
|
8
|
+
%ignore WS_INLINE
|
|
9
|
+
|
|
10
|
+
IDENTIFIER: /[a-zA-Z_][a-zA-Z_0-9]*/
|
|
11
|
+
_DBL_STAR: "**"
|
|
12
|
+
COMMA: ","
|
|
13
|
+
|
|
14
|
+
?type: non_identifier_type
|
|
15
|
+
| identifier -> type_struct
|
|
16
|
+
|
|
17
|
+
comma_separated{item}: item? (COMMA item)* COMMA?
|
|
18
|
+
|
|
19
|
+
named_type: identifier (":" type)? | non_identifier_type
|
|
20
|
+
non_identifier_type: "felt" -> type_felt
|
|
21
|
+
| "codeoffset" -> type_codeoffset
|
|
22
|
+
| type "*" -> type_pointer
|
|
23
|
+
| type _DBL_STAR -> type_pointer2
|
|
24
|
+
| "(" comma_separated{named_type} ")" -> type_tuple
|
|
25
|
+
|
|
26
|
+
identifier: IDENTIFIER ("." IDENTIFIER)*
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def parse(code: str) -> CairoType:
|
|
31
|
+
"""
|
|
32
|
+
Parses the given string and returns a CairoType.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
grammar = CAIRO_EBNF
|
|
36
|
+
|
|
37
|
+
grammar_parser = Lark(
|
|
38
|
+
grammar=grammar,
|
|
39
|
+
start=["type"],
|
|
40
|
+
parser="lalr",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
parsed = grammar_parser.parse(code)
|
|
44
|
+
transformed = ParserTransformer().transform(parsed)
|
|
45
|
+
|
|
46
|
+
return transformed
|