LL(1) parser generator
Project description
Arcee
It is a Python parser generator, use EBNF-like syntax.
Install
$ pip install Arcee
Example
It's really readable.
grammar:
KEYWORDS : let, if, zero, -
NUMBER : \d+(\.\d*)?
ASSIGN : =
SUBTRACTION : -
RIGHT_BRACKET : (
COLON : ,
LETF_BRACKET : )
ID : [A-Za-z]+
SKIP : [ \\t]+
program : expression ;
expression : zeroexp
| diffexp
| ifexp
| varexp
| letexp
| constexp
;
constexp : $NUMBER ;
diffexp : '-' '(' expression ',' expression ')' ;
zeroexp : 'zero' '(' expression ')' ;
ifexp : 'if' expression 'then' expression 'else' expression ;
varexp : $ID ;
letexp : 'let' $ID '=' expression 'in' expression ;
$ arcee grammar > result.py
result.py
has three parts:
Token
from collections import namedtuple
Token = namedtuple('Token', ['type', 'value', 'line', 'column'])
Program = namedtuple('Program', ['expression'])
# ...
Lexer
import re
def tokenize(code):
pass # ...
Parser
class Parser:
def __init__(self, token_list):
pass
# ...
def parse_expression(self):
if xxx:
self.parse_constexp()
elif yyy:
self.parse_diffexp()
#...
def parse_constexp(self):
pass
def parse_diffexp(self):
pass
def parse_zeroexp(self):
pass
def parse_ifexp(self):
pass
def parse_varexp(self):
pass
def parse_letexp(self):
pass
You can parse input such as:
input = '''let a = 0 in if zero(a) then -(a, 1) else -(a, 2)'''
tokens = list(tokenize(input))
parser = Parser(tokens)
parser.parse_program()
result is:
result = Program(
expression=Expression(
nonterminal=Letexp(
ID=Token(type='ID', value='a', line=2, column=4),
expression1=Expression(
nonterminal=Constexp(
NUMBER=Token(type='NUMBER', value='0', line=2, column=8))),
expression2=Expression(
nonterminal=Ifexp(
expression1=Expression(
nonterminal=Zeroexp(
expression=Expression(
nonterminal=Varexp(
ID=Token(type='ID', value='a', line=2, column=21))))),
expression2=Expression(
nonterminal=Diffexp(
expression1=Expression(
nonterminal=Varexp(
ID=Token(type='ID', value='a', line=2, column=31))),
expression2=Expression(
nonterminal=Constexp(
NUMBER=Token(type='NUMBER', value='1', line=2,
column=34))))),
expression3=Expression(
nonterminal=Diffexp(
expression1=Expression(
nonterminal=Varexp(
ID=Token(type='ID', value='a', line=2, column=44))),
expression2=Expression(
nonterminal=Constexp(
NUMBER=Token(type='NUMBER', value='2', line=2,
column=47))))))))))
Now, you can use this ast to do what you like.
You can also use api in your Python file.
from arcee import generate
grammar = '''KEYWORDS : let, if, zero, -
NUMBER : \d+(\.\d*)?
ASSIGN : =
SUBTRACTION : -
RIGHT_BRACKET : (
COLON : ,
LETF_BRACKET : )
ID : [A-Za-z]+
SKIP : [ \\t]+
program : expression ;
expression : zeroexp
| diffexp
| ifexp
| varexp
| letexp
| constexp
;
constexp : $NUMBER ;
diffexp : '-' '(' expression ',' expression ')' ;
zeroexp : 'zero' '(' expression ')' ;
ifexp : 'if' expression 'then' expression 'else' expression ;
varexp : $ID ;
letexp : 'let' $ID '=' expression 'in' expression ;'''
print(generate(grammar))
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 Distribution
arcee-0.1.1.tar.gz
(8.7 kB
view details)
Built Distribution
arcee-0.1.1-py3-none-any.whl
(14.1 kB
view details)
File details
Details for the file arcee-0.1.1.tar.gz
.
File metadata
- Download URL: arcee-0.1.1.tar.gz
- Upload date:
- Size: 8.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.2.0 requests-toolbelt/0.8.0 tqdm/4.25.0 CPython/3.7.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f7703eac60d50426f369bc89e8c612c153b2962f15e8482784ba07f03b557e56 |
|
MD5 | cd5a309f2208dd5f9f247e469865dbf1 |
|
BLAKE2b-256 | 119361bd2b1c2c0731ab52db9782dc2175e35d587a5a9862133649b4c9f08bc0 |
File details
Details for the file arcee-0.1.1-py3-none-any.whl
.
File metadata
- Download URL: arcee-0.1.1-py3-none-any.whl
- Upload date:
- Size: 14.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.2.0 requests-toolbelt/0.8.0 tqdm/4.25.0 CPython/3.7.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7146b1c5ad723183b4bddca5c62b6e96d6784703d0b5b5a6994d704a383d8d7b |
|
MD5 | 2bbd60885902e2452c8d612ec1d0bdc7 |
|
BLAKE2b-256 | 4115ec6a216378600e397eec0e6c703fdfc8014f41960c8e326f8be621fa6cfb |