Parser generator
Project description
syntactes
A simpler Python parser generator.
The name is derived from Greek συντάκτης (/sin'daktis/) meaning editor/composer.
Features
- Parsing table creation
- Token parsing and action execution
Installation
> pip install syntactes
Quick start
Creating a parsing table
from syntactes import Grammar, Rule, SLRGenerator, Token
EOF = Token.eof()
S = Token("S", is_terminal=False)
E = Token("E", False)
T = Token("T", False)
x = Token("x", True)
PLUS = Token("+", True)
tokens = {EOF, S, E, T, x, PLUS}
# 0. S -> E $
# 1. E -> T + E
# 2. E -> T
# 3. T -> x
rule_1 = Rule(0, S, E, EOF)
rule_2 = Rule(1, E, T, PLUS, E)
rule_3 = Rule(2, E, T)
rule_4 = Rule(4, T, x)
rules = (rule_1, rule_2, rule_3, rule_4)
grammar = Grammar(rule_1, rules, tokens)
generator = SLRGenerator(grammar)
parsing_table = generator.generate()
print(parsing_table.pretty_str())
Running the above example produces this output:
GRAMMAR RULES
-------------
0. S -> E $
1. E -> T + E
2. E -> T
3. T -> x
-------------
SLR PARSING TABLE
-------------------------------------------------
| | $ | + | E | S | T | x |
-------------------------------------------------
| 1 | -- | -- | s4 | -- | s2 | s3 |
-------------------------------------------------
| 2 | r2 | s5 | -- | -- | -- | -- |
-------------------------------------------------
| 3 | r4 | r4 | -- | -- | -- | -- |
-------------------------------------------------
| 4 | a | -- | -- | -- | -- | -- |
------------------------------------------------
| 5 | -- | -- | s6 | -- | s2 | s3 |
-------------------------------------------------
| 6 | r1 | -- | -- | -- | -- | -- |
-------------------------------------------------
Parsing
from syntactes import Grammar, Rule, Token
from syntactes.parser import ParserError, SLRParser, execute_on
EOF = Token.eof()
S = Token("S", is_terminal=False)
E = Token("E", False)
T = Token("T", False)
x = Token("x", True, 1) # value of token is 1
PLUS = Token("+", True)
tokens = {EOF, S, E, T, x, PLUS}
# 0. S -> E $
# 1. E -> T + E
# 2. E -> T
# 3. T -> x
rule_1 = Rule(0, S, E, EOF)
rule_2 = Rule(1, E, T, PLUS, E)
rule_3 = Rule(2, E, T)
rule_4 = Rule(4, T, x)
rules = (rule_1, rule_2, rule_3, rule_4)
grammar = Grammar(rule_1, rules, tokens)
parser = SLRParser.from_grammar(grammar)
@execute_on(rule_4)
def push_value(x_token):
# Add and argument for every token on the right-hand side of the rule.
print(
f"received token {x_token} with value: {x_token.value}, reducing by rule: {rule_4}"
)
@execute_on(rule_2)
def add(left, plus, right):
print(f"received tokens {left}, {plus}, {right}, reducing by rule: {rule_2}")
print("Parsing stream: x + x + x $\n")
parser.parse([x, PLUS, x, PLUS, x, EOF])
print("\nParsing stream: x + $\n")
try:
parser.parse([x, PLUS, EOF])
except ParserError as e:
print("ParserError:", e)
Running the above example produces this output:
Parsing stream: x + x + x $
received token x with value: 1, reducing by rule: T -> x
received token x with value: 1, reducing by rule: T -> x
received token x with value: 1, reducing by rule: T -> x
received tokens E, +, T, reducing by rule: E -> T + E
received tokens E, +, T, reducing by rule: E -> T + E
Parsing stream: x + $
received token x with value: 1, reducing by rule: T -> x
ParserError: Received token: $; expected one of: ['x', 'T', 'E']
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
syntactes-0.4.0.tar.gz
(13.5 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
syntactes-0.4.0-py3-none-any.whl
(16.3 kB
view details)
File details
Details for the file syntactes-0.4.0.tar.gz.
File metadata
- Download URL: syntactes-0.4.0.tar.gz
- Upload date:
- Size: 13.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3b48098c101336c7bc5b58eaaff37a70ed828c14e877428dc1f3c9ec25273126
|
|
| MD5 |
0fd2c76fb15784cd6a8e3268c8d74801
|
|
| BLAKE2b-256 |
39f0808d45a037a26492596d732c1dd6243f809a43846eebc38b623f41bb1f24
|
File details
Details for the file syntactes-0.4.0-py3-none-any.whl.
File metadata
- Download URL: syntactes-0.4.0-py3-none-any.whl
- Upload date:
- Size: 16.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3dc0da8dead0f195847c02c3ad4eb4d1c079ec2e0f3503964f501f1d2a57f5f9
|
|
| MD5 |
11a1a48de4b8fb5e0c363d45641d1078
|
|
| BLAKE2b-256 |
e6f6a17557b320c5b8474fd5e19a6dff8c6b42f9e9db9f8be9d0acdf24db9c1b
|