Crates.io | combine-language |
lib.rs | combine-language |
version | 4.0.0 |
source | src |
created_at | 2015-07-17 14:32:56.372325 |
updated_at | 2020-12-14 18:01:56.787638 |
description | Extra parser combinators, useful for parsing programming languages. |
homepage | |
repository | https://github.com/Marwes/combine-language |
max_upload_size | |
id | 2625 |
size | 44,905 |
This a crate providing an easy way of constructing parsers which can easily parse various programming languages. It has much of the same API as Text.Parsec.Token but are otherwise a bit different to fit in to the ownership model of rust. The crate is an extension of the combine crate.
extern crate combine;
extern crate combine_language;
use combine::{satisfy, EasyParser, Parser};
use combine::parser::char::{alpha_num, letter, string};
use combine_language::{Identifier, LanguageEnv, LanguageDef};
fn main() {
let env = LanguageEnv::new(LanguageDef {
ident: Identifier {
start: letter(),
rest: alpha_num(),
reserved: ["if", "then", "else", "let", "in", "type"].iter()
.map(|x| (*x).into())
.collect(),
},
op: Identifier {
start: satisfy(|c| "+-*/".chars().any(|x| x == c)),
rest: satisfy(|c| "+-*/".chars().any(|x| x == c)),
reserved: ["+", "-", "*", "/"].iter().map(|x| (*x).into()).collect()
},
comment_start: string("/*").map(|_| ()),
comment_end: string("*/").map(|_| ()),
comment_line: string("//").map(|_| ()),
});
let id = env.identifier();//An identifier parser
let integer = env.integer();//An integer parser
let result = (id, integer).easy_parse("this /* Skips comments */ 42");
assert_eq!(result, Ok(((String::from("this"), 42), "")));
}