Hat PEG parser
Project description
This library is part of Hat Open project - open-source framework of tools and libraries for developing applications used for remote monitoring, control and management of intelligent electronic devices such as IoT devices, PLCs, industrial automation or home automation systems.
Development of Hat Open and associated repositories is sponsored by Končar - Power Plant and Electric Traction Engineering Inc. (Končar KET - https://www.koncar-ket.hr).
For more information see:
hat-peg documentation - https://core.hat-open.com/docs/libraries/peg.html
Hat Core homepage - https://core.hat-open.com
Hat Core git repository - https://github.com/hat-open/hat-core.git
About
Implementation of PEG parser as described in paper “Parsing Expression Grammars: A Recognition-Based Syntactic Foundation” (Bryan Ford, 2004). PEG’s grammar itself can be defined by PEG grammar:
# Hierarchical syntax Grammar <- Spacing Definition+ EndOfFile Definition <- Identifier LEFTARROW Expression Expression <- Sequence (SLASH Sequence)* Sequence <- Prefix* Prefix <- (AND / NOT)? Suffix Suffix <- Primary (QUESTION / STAR / PLUS)? Primary <- Identifier !LEFTARROW / OPEN Expression CLOSE / Literal / Class / DOT # Lexical syntax Identifier <- IdentStart IdentCont* Spacing IdentStart <- [a-zA-Z_] IdentCont <- IdentStart / [0-9] Literal <- ['] (!['] Char)* ['] Spacing / ["] (!["] Char)* ["] Spacing Class <- '[' (!']' Range)* ']' Spacing Range <- Char '-' Char / Char Char <- '\\' [nrt'"\[\]\\] / '\\' 'x' Hex Hex / '\\' 'u' Hex Hex Hex Hex / !'\\' . Hex <- [0-9a-fA-F] LEFTARROW <- '<-' Spacing SLASH <- '/' Spacing AND <- '&' Spacing NOT <- '!' Spacing QUESTION <- '?' Spacing STAR <- '*' Spacing PLUS <- '+' Spacing OPEN <- '(' Spacing CLOSE <- ')' Spacing DOT <- '.' Spacing Spacing <- (Space / Comment)* Comment <- '#' (!EndOfLine .)* EndOfLine Space <- ' ' / '\t' / EndOfLine EndOfLine <- '\r\n' / '\n' / '\r' EndOfFile <- !.
Example usage of PEG parser:
import functools import hat.peg grammar = hat.peg.Grammar(r''' Expr <- Sum Sum <- Product (('+' / '-') Product)* Product <- Value (('*' / '/') Value)* Value <- Spacing ([0-9]+ / '(' Expr ')') Spacing Spacing <- ' '* ''', 'Expr') ast = grammar.parse('1 + 2 * 3 + (4 - 5) * 6 + 7') result = hat.peg.walk_ast(ast, { 'Expr': lambda n, c: c[0], 'Sum': lambda n, c: functools.reduce( (lambda acc, x: acc + x[1] if x[0] == '+' else acc - x[1]), zip(c[1::2], c[2::2]), c[0]), 'Product': lambda n, c: functools.reduce( (lambda acc, x: acc * x[1] if x[0] == '*' else acc / x[1]), zip(c[1::2], c[2::2]), c[0]), 'Value': lambda n, c: (c[2] if c[1] == '(' else int(''.join(c[1:-1])))}) assert result == 8
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file hat_peg-0.4.1.dev20210601-cp38.cp39-none-any.whl
.
File metadata
- Download URL: hat_peg-0.4.1.dev20210601-cp38.cp39-none-any.whl
- Upload date:
- Size: 7.5 kB
- Tags: CPython 3.8, CPython 3.9
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.9.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5f4e4fa5004b1c63d59491f79ce6f305df91dd011c10ba3c95551dd5279dfc81 |
|
MD5 | 98e70d52946e42670c645539646e91a0 |
|
BLAKE2b-256 | b36f074ce8253fd7cfe73f715a6b2f195fcbb32b0b7e652e6a286c150d37aae6 |