funcparserlib

1.0.1 · active · verified Thu Apr 16

funcparserlib is a recursive descent parsing library for Python, based on functional combinators. It is currently at version 1.0.1 and is primarily designed for parsing small languages or external Domain Specific Languages (DSLs). The library provides a concise and type-hinted API, focusing on ease of parser construction without extensive manual lookahead management. It maintains an active development status with a moderately paced release cadence.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to define a tokenizer using `make_tokenizer` and then build a simple parser for 'number operator number' expressions using `funcparserlib`'s combinators like `tok`, `+`, and `>>`. It covers tokenizing input, defining terminal parsers, and combining them into a full grammar, finally parsing a sample string.

from typing import List
from funcparserlib.lexer import make_tokenizer, TokenSpec, Token
from funcparserlib.parser import tok, Parser, many, finished

def tokenize(s: str) -> List[Token]:
    specs = [
        TokenSpec('whitespace', r'\s+'),
        TokenSpec('number', r'\d+'),
        TokenSpec('op', r'[+-*/()]'),
    ]
    tokenizer = make_tokenizer(specs)
    return [t for t in tokenizer(s) if t.type != 'whitespace']

# Define parsers
number_parser: Parser[Token, int] = tok('number') >> (lambda t: int(t.value))
op_parser: Parser[Token, str] = tok('op') >> (lambda t: t.value)

# A simple grammar for 'number op number'
expr_parser: Parser[Token, tuple] = number_parser + op_parser + number_parser

# Parse a string
input_str = "123 + 45"
tokens = tokenize(input_str)
result = (expr_parser + -finished).parse(tokens)

print(f"Input: {input_str}")
print(f"Tokens: {tokens}")
print(f"Parsed result: {result}")
# Expected: (123, '+', 45)

view raw JSON →