Skip to content

Repository files navigation

imageimageimageActions status

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

fromsyntactesimportGrammar, Rule, SLRGenerator, TokenEOF=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 -> xrule_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

fromsyntactesimportGrammar, Rule, Tokenfromsyntactes.parserimportParserError, SLRParser, execute_onEOF=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 1PLUS=Token("+", True)
tokens= {EOF, S, E, T, x, PLUS}
# 0. S -> E $# 1. E -> T + E# 2. E -> T# 3. T -> xrule_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)defpush_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)defadd(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])
exceptParserErrorase:
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']

About

Python parser generator

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages