diff --git a/RELEASES.md b/RELEASES.md index bc8001d..812634c 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,4 +1,41 @@ -# master (not yet released) +# Version 0.13 + +This is a bug release for LALRPOP. First, we have two major improvements to the +generated lexer: + +- The lexer now generates code that uses the `regex` crate. This + results in **far** less code than the older style, and seems to + preserve performance. +- The lexer now supports custom priorities for regular expression tokens, + making it possible to support case-insensitive keywords. + - See the [calculator2b example] for details. + +Second, we have a **beta release** of the new lane-table based +LR-table generation. Lane tables handle the full set of LR(1) +grammars but typically reduce **much** smaller state tables. This +feature eliminates the need to manually mark grammars as `#[LALR]`. +Lane tables are **not** on by default; you can enable them by setting +`LALRPOP_LANE_TABLE=enabled` in your environment (use +`std::env::set_var` in your `build.rs`). + +[calculator2b example]: https://github.com/nikomatsakis/lalrpop/blob/master/doc/tutorial.md#calculator2b + +Finally, the `lalrpop` executable now has the ability to generate +standalone reports (`--report`). + +Fixed bugs: + +- Fix #157: We now recognize single quote (`'`) properly in our tokenizer. +- Fix #179: Fix bug in recursive ascent code generation. + +Thanks to the following contributors to this release: + +- @ahmedcharles +- @king6cong +- @nikomatsakis +- @nixpulvis +- @wagenet +- @wieczyk # Version 0.12.5 diff --git a/doc/calculator/Cargo.toml b/doc/calculator/Cargo.toml index 2b90fbb..8815f77 100644 --- a/doc/calculator/Cargo.toml +++ b/doc/calculator/Cargo.toml @@ -1,17 +1,17 @@ [package] name = "calculator" -version = "0.12.5" +version = "0.13.0" authors = ["Niko Matsakis "] build = "build.rs" # <-- We added this and everything after! workspace = "../.." [build-dependencies.lalrpop] -version = "0.12.5" +version = "0.13.0" path = "../../lalrpop" [dependencies] regex = "0.2.1" [dependencies.lalrpop-util] -version = "0.12.5" +version = "0.13.0" path = "../../lalrpop-util" diff --git a/doc/pascal/lalrpop/Cargo.toml b/doc/pascal/lalrpop/Cargo.toml index b039a09..75a9146 100644 --- a/doc/pascal/lalrpop/Cargo.toml +++ b/doc/pascal/lalrpop/Cargo.toml @@ -9,6 +9,9 @@ path = "../../../lalrpop" [dependencies] docopt = "0.7" -lalrpop-util = { version = "0.12.5", path = "../../../lalrpop-util" } rustc-serialize = "0.3" regex = "0.2.1" + +[dependencies.lalrpop-util] +version = "0.13.0" +path = "../../../lalrpop-util" diff --git a/doc/whitespace/Cargo.toml b/doc/whitespace/Cargo.toml index 451bf0e..f2862ca 100644 --- a/doc/whitespace/Cargo.toml +++ b/doc/whitespace/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "whitespace" -version = "0.12.5" +version = "0.13.0" authors = ["Mako "] build = "build.rs" [build-dependencies.lalrpop] -version = "0.12.5" +version = "0.13.0" path = "../../lalrpop" [dependencies.lalrpop-util] -version = "0.12.5" +version = "0.13.0" path = "../../lalrpop-util" diff --git a/lalrpop-intern/Cargo.toml b/lalrpop-intern/Cargo.toml index 6d40c39..761a25d 100644 --- a/lalrpop-intern/Cargo.toml +++ b/lalrpop-intern/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lalrpop-intern" -version = "0.12.5" # LALRPOP +version = "0.13.0" # LALRPOP description = "Simple string interner used by LALRPOP" repository = "https://github.com/nikomatsakis/lalrpop" license = "Apache-2.0/MIT" diff --git a/lalrpop-snap/Cargo.toml b/lalrpop-snap/Cargo.toml index 43c6e22..f90c3a7 100644 --- a/lalrpop-snap/Cargo.toml +++ b/lalrpop-snap/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lalrpop-snap" -version = "0.12.5" # LALRPOP +version = "0.13.0" # LALRPOP description = "snapshot of LALRPOP for use in bootstrapping" repository = "https://github.com/nikomatsakis/lalrpop" license = "Apache-2.0/MIT" @@ -30,8 +30,8 @@ rand = "0.3" [dependencies.lalrpop-util] path = "../lalrpop-util" -version = "0.12.5" # LALRPOP +version = "0.13.0" # LALRPOP [dependencies.lalrpop-intern] path = "../lalrpop-intern" -version = "0.12.5" # LALRPOP +version = "0.13.0" # LALRPOP diff --git a/lalrpop-test/Cargo.toml b/lalrpop-test/Cargo.toml index be438ee..aac8bc2 100644 --- a/lalrpop-test/Cargo.toml +++ b/lalrpop-test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lalrpop-test" -version = "0.12.5" # LALRPOP +version = "0.13.0" # LALRPOP authors = ["Niko Matsakis "] license = "Apache-2.0/MIT" build = "build.rs" diff --git a/lalrpop-test/src/match_section.rs b/lalrpop-test/src/match_section.rs deleted file mode 100644 index 01a2f9d..0000000 --- a/lalrpop-test/src/match_section.rs +++ /dev/null @@ -1,1113 +0,0 @@ -extern crate lalrpop_util as __lalrpop_util; - -mod __parse__Query { - #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports)] - - extern crate lalrpop_util as __lalrpop_util; - pub fn parse_Query< - 'input, - >( - input: &'input str, - ) -> Result> - { - let __ascent = __ascent::parse_Query( - input, - ); - let __parse_table = __parse_table::parse_Query( - input, - ); - assert_eq!(__ascent, __parse_table); - return __ascent; - } - mod __ascent { - - mod __parse__Query { - #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports)] - - extern crate lalrpop_util as __lalrpop_util; - pub fn parse_Query< - 'input, - >( - input: &'input str, - ) -> Result> - { - let mut __tokens = super::super::super::__intern_token::__Matcher::new(input); - let __lookahead = match __tokens.next() { - Some(Ok(v)) => Some(v), - None => None, - Some(Err(e)) => return Err(e), - }; - match try!(__state0(input, &mut __tokens, __lookahead, ::std::marker::PhantomData::<()>)) { - (Some(__lookahead), _) => { - Err(__lalrpop_util::ParseError::ExtraToken { token: __lookahead }) - } - (None, __Nonterminal::____Query((_, __nt, _))) => { - Ok(__nt) - } - _ => unreachable!(), - } - } - - #[allow(dead_code)] - pub enum __Nonterminal<> { - Keyword((usize, String, usize)), - Query((usize, String, usize)), - Table((usize, String, usize)), - ____Query((usize, String, usize)), - } - - // State 0 - // AllInputs = [] - // OptionalInputs = [] - // FixedInputs = [] - // WillPushLen = 0 - // WillPush = [] - // WillProduce = None - // - // Keyword = (*) "INSERT" ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // Keyword = (*) r#"(?i)select"# ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // Keyword = (*) UPDATE ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // Query = (*) Keyword Table ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // __Query = (*) Query ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // - // "INSERT" -> S3 - // r#"(?i)select"# -> S4 - // UPDATE -> S5 - // - // Keyword -> S1 - // Query -> S2 - pub fn __state0< - 'input, - __TOKENS: Iterator>>, - >( - input: &'input str, - __tokens: &mut __TOKENS, - __lookahead: Option<(usize, (usize, &'input str), usize)>, - _: ::std::marker::PhantomData<()>, - ) -> Result<(Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>), __lalrpop_util::ParseError> - { - let mut __result: (Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>); - match __lookahead { - Some((__loc1, (1, __tok0), __loc2)) => { - let __sym0 = (__loc1, (__tok0), __loc2); - __result = try!(__state3(input, __tokens, __sym0, ::std::marker::PhantomData::<()>)); - } - Some((__loc1, (2, __tok0), __loc2)) => { - let __sym0 = (__loc1, (__tok0), __loc2); - __result = try!(__state4(input, __tokens, __sym0, ::std::marker::PhantomData::<()>)); - } - Some((__loc1, (3, __tok0), __loc2)) => { - let __sym0 = (__loc1, (__tok0), __loc2); - __result = try!(__state5(input, __tokens, __sym0, ::std::marker::PhantomData::<()>)); - } - _ => { - return Err(__lalrpop_util::ParseError::UnrecognizedToken { - token: __lookahead, - expected: vec![ - r###""INSERT""###.to_string(), - r###"r#"(?i)select"#"###.to_string(), - r###"UPDATE"###.to_string(), - ] - }); - } - } - loop { - let (__lookahead, __nt) = __result; - match __nt { - __Nonterminal::Keyword(__sym0) => { - __result = try!(__state1(input, __tokens, __lookahead, __sym0, ::std::marker::PhantomData::<()>)); - } - __Nonterminal::Query(__sym0) => { - __result = try!(__state2(input, __tokens, __lookahead, __sym0, ::std::marker::PhantomData::<()>)); - } - _ => { - return Ok((__lookahead, __nt)); - } - } - } - } - - // State 1 - // AllInputs = [Keyword] - // OptionalInputs = [] - // FixedInputs = [Keyword] - // WillPushLen = 1 - // WillPush = [Table] - // WillProduce = Some(Query) - // - // Query = Keyword (*) Table ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // Table = (*) r#"(?i)[a-z]+"# ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // - // r#"(?i)[a-z]+"# -> S7 - // - // Table -> S6 - pub fn __state1< - 'input, - __TOKENS: Iterator>>, - >( - input: &'input str, - __tokens: &mut __TOKENS, - __lookahead: Option<(usize, (usize, &'input str), usize)>, - __sym0: (usize, String, usize), - _: ::std::marker::PhantomData<()>, - ) -> Result<(Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>), __lalrpop_util::ParseError> - { - let mut __result: (Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>); - match __lookahead { - Some((__loc1, (0, __tok0), __loc2)) => { - let __sym1 = (__loc1, (__tok0), __loc2); - __result = try!(__state7(input, __tokens, __sym1, ::std::marker::PhantomData::<()>)); - } - _ => { - return Err(__lalrpop_util::ParseError::UnrecognizedToken { - token: __lookahead, - expected: vec![ - r###"r#"(?i)[a-z]+"#"###.to_string(), - ] - }); - } - } - loop { - let (__lookahead, __nt) = __result; - match __nt { - __Nonterminal::Table(__sym1) => { - __result = try!(__state6(input, __tokens, __lookahead, __sym0, __sym1, ::std::marker::PhantomData::<()>)); - return Ok(__result); - } - _ => { - return Ok((__lookahead, __nt)); - } - } - } - } - - // State 2 - // AllInputs = [Query] - // OptionalInputs = [] - // FixedInputs = [Query] - // WillPushLen = 0 - // WillPush = [] - // WillProduce = Some(__Query) - // - // __Query = Query (*) ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // - // ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] -> __Query = Query => ActionFn(0); - // - pub fn __state2< - 'input, - __TOKENS: Iterator>>, - >( - input: &'input str, - __tokens: &mut __TOKENS, - __lookahead: Option<(usize, (usize, &'input str), usize)>, - __sym0: (usize, String, usize), - _: ::std::marker::PhantomData<()>, - ) -> Result<(Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>), __lalrpop_util::ParseError> - { - let mut __result: (Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>); - match __lookahead { - Some((_, (1, _), _)) | - Some((_, (0, _), _)) | - Some((_, (2, _), _)) | - Some((_, (3, _), _)) | - None => { - let __start = __sym0.0.clone(); - let __end = __sym0.2.clone(); - let __nt = super::super::super::__action0::<>(input, __sym0); - let __nt = __Nonterminal::____Query(( - __start, - __nt, - __end, - )); - __result = (__lookahead, __nt); - return Ok(__result); - } - _ => { - return Err(__lalrpop_util::ParseError::UnrecognizedToken { - token: __lookahead, - expected: vec![ - r###""INSERT""###.to_string(), - r###"r#"(?i)[a-z]+"#"###.to_string(), - r###"r#"(?i)select"#"###.to_string(), - r###"UPDATE"###.to_string(), - ] - }); - } - } - } - - // State 3 - // AllInputs = ["INSERT"] - // OptionalInputs = [] - // FixedInputs = ["INSERT"] - // WillPushLen = 0 - // WillPush = [] - // WillProduce = Some(Keyword) - // - // Keyword = "INSERT" (*) ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // - // ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] -> Keyword = "INSERT" => ActionFn(2); - // - pub fn __state3< - 'input, - __TOKENS: Iterator>>, - >( - input: &'input str, - __tokens: &mut __TOKENS, - __sym0: (usize, &'input str, usize), - _: ::std::marker::PhantomData<()>, - ) -> Result<(Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>), __lalrpop_util::ParseError> - { - let mut __result: (Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>); - let __lookahead = match __tokens.next() { - Some(Ok(v)) => Some(v), - None => None, - Some(Err(e)) => return Err(e), - }; - match __lookahead { - Some((_, (1, _), _)) | - Some((_, (0, _), _)) | - Some((_, (2, _), _)) | - Some((_, (3, _), _)) | - None => { - let __start = __sym0.0.clone(); - let __end = __sym0.2.clone(); - let __nt = super::super::super::__action2::<>(input, __sym0); - let __nt = __Nonterminal::Keyword(( - __start, - __nt, - __end, - )); - __result = (__lookahead, __nt); - return Ok(__result); - } - _ => { - return Err(__lalrpop_util::ParseError::UnrecognizedToken { - token: __lookahead, - expected: vec![ - r###""INSERT""###.to_string(), - r###"r#"(?i)[a-z]+"#"###.to_string(), - r###"r#"(?i)select"#"###.to_string(), - r###"UPDATE"###.to_string(), - ] - }); - } - } - } - - // State 4 - // AllInputs = [r#"(?i)select"#] - // OptionalInputs = [] - // FixedInputs = [r#"(?i)select"#] - // WillPushLen = 0 - // WillPush = [] - // WillProduce = Some(Keyword) - // - // Keyword = r#"(?i)select"# (*) ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // - // ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] -> Keyword = r#"(?i)select"# => ActionFn(1); - // - pub fn __state4< - 'input, - __TOKENS: Iterator>>, - >( - input: &'input str, - __tokens: &mut __TOKENS, - __sym0: (usize, &'input str, usize), - _: ::std::marker::PhantomData<()>, - ) -> Result<(Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>), __lalrpop_util::ParseError> - { - let mut __result: (Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>); - let __lookahead = match __tokens.next() { - Some(Ok(v)) => Some(v), - None => None, - Some(Err(e)) => return Err(e), - }; - match __lookahead { - Some((_, (1, _), _)) | - Some((_, (0, _), _)) | - Some((_, (2, _), _)) | - Some((_, (3, _), _)) | - None => { - let __start = __sym0.0.clone(); - let __end = __sym0.2.clone(); - let __nt = super::super::super::__action1::<>(input, __sym0); - let __nt = __Nonterminal::Keyword(( - __start, - __nt, - __end, - )); - __result = (__lookahead, __nt); - return Ok(__result); - } - _ => { - return Err(__lalrpop_util::ParseError::UnrecognizedToken { - token: __lookahead, - expected: vec![ - r###""INSERT""###.to_string(), - r###"r#"(?i)[a-z]+"#"###.to_string(), - r###"r#"(?i)select"#"###.to_string(), - r###"UPDATE"###.to_string(), - ] - }); - } - } - } - - // State 5 - // AllInputs = [UPDATE] - // OptionalInputs = [] - // FixedInputs = [UPDATE] - // WillPushLen = 0 - // WillPush = [] - // WillProduce = Some(Keyword) - // - // Keyword = UPDATE (*) ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // - // ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] -> Keyword = UPDATE => ActionFn(3); - // - pub fn __state5< - 'input, - __TOKENS: Iterator>>, - >( - input: &'input str, - __tokens: &mut __TOKENS, - __sym0: (usize, &'input str, usize), - _: ::std::marker::PhantomData<()>, - ) -> Result<(Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>), __lalrpop_util::ParseError> - { - let mut __result: (Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>); - let __lookahead = match __tokens.next() { - Some(Ok(v)) => Some(v), - None => None, - Some(Err(e)) => return Err(e), - }; - match __lookahead { - Some((_, (1, _), _)) | - Some((_, (0, _), _)) | - Some((_, (2, _), _)) | - Some((_, (3, _), _)) | - None => { - let __start = __sym0.0.clone(); - let __end = __sym0.2.clone(); - let __nt = super::super::super::__action3::<>(input, __sym0); - let __nt = __Nonterminal::Keyword(( - __start, - __nt, - __end, - )); - __result = (__lookahead, __nt); - return Ok(__result); - } - _ => { - return Err(__lalrpop_util::ParseError::UnrecognizedToken { - token: __lookahead, - expected: vec![ - r###""INSERT""###.to_string(), - r###"r#"(?i)[a-z]+"#"###.to_string(), - r###"r#"(?i)select"#"###.to_string(), - r###"UPDATE"###.to_string(), - ] - }); - } - } - } - - // State 6 - // AllInputs = [Keyword, Table] - // OptionalInputs = [] - // FixedInputs = [Keyword, Table] - // WillPushLen = 0 - // WillPush = [] - // WillProduce = Some(Query) - // - // Query = Keyword Table (*) ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // - // ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] -> Query = Keyword, Table => ActionFn(5); - // - pub fn __state6< - 'input, - __TOKENS: Iterator>>, - >( - input: &'input str, - __tokens: &mut __TOKENS, - __lookahead: Option<(usize, (usize, &'input str), usize)>, - __sym0: (usize, String, usize), - __sym1: (usize, String, usize), - _: ::std::marker::PhantomData<()>, - ) -> Result<(Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>), __lalrpop_util::ParseError> - { - let mut __result: (Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>); - match __lookahead { - Some((_, (1, _), _)) | - Some((_, (0, _), _)) | - Some((_, (2, _), _)) | - Some((_, (3, _), _)) | - None => { - let __start = __sym0.0.clone(); - let __end = __sym1.2.clone(); - let __nt = super::super::super::__action5::<>(input, __sym0, __sym1); - let __nt = __Nonterminal::Query(( - __start, - __nt, - __end, - )); - __result = (__lookahead, __nt); - return Ok(__result); - } - _ => { - return Err(__lalrpop_util::ParseError::UnrecognizedToken { - token: __lookahead, - expected: vec![ - r###""INSERT""###.to_string(), - r###"r#"(?i)[a-z]+"#"###.to_string(), - r###"r#"(?i)select"#"###.to_string(), - r###"UPDATE"###.to_string(), - ] - }); - } - } - } - - // State 7 - // AllInputs = [r#"(?i)[a-z]+"#] - // OptionalInputs = [] - // FixedInputs = [r#"(?i)[a-z]+"#] - // WillPushLen = 0 - // WillPush = [] - // WillProduce = Some(Table) - // - // Table = r#"(?i)[a-z]+"# (*) ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // - // ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] -> Table = r#"(?i)[a-z]+"# => ActionFn(4); - // - pub fn __state7< - 'input, - __TOKENS: Iterator>>, - >( - input: &'input str, - __tokens: &mut __TOKENS, - __sym0: (usize, &'input str, usize), - _: ::std::marker::PhantomData<()>, - ) -> Result<(Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>), __lalrpop_util::ParseError> - { - let mut __result: (Option<(usize, (usize, &'input str), usize)>, __Nonterminal<>); - let __lookahead = match __tokens.next() { - Some(Ok(v)) => Some(v), - None => None, - Some(Err(e)) => return Err(e), - }; - match __lookahead { - Some((_, (1, _), _)) | - Some((_, (0, _), _)) | - Some((_, (2, _), _)) | - Some((_, (3, _), _)) | - None => { - let __start = __sym0.0.clone(); - let __end = __sym0.2.clone(); - let __nt = super::super::super::__action4::<>(input, __sym0); - let __nt = __Nonterminal::Table(( - __start, - __nt, - __end, - )); - __result = (__lookahead, __nt); - return Ok(__result); - } - _ => { - return Err(__lalrpop_util::ParseError::UnrecognizedToken { - token: __lookahead, - expected: vec![ - r###""INSERT""###.to_string(), - r###"r#"(?i)[a-z]+"#"###.to_string(), - r###"r#"(?i)select"#"###.to_string(), - r###"UPDATE"###.to_string(), - ] - }); - } - } - } - } - pub use self::__parse__Query::parse_Query; - } - mod __parse_table { - - mod __parse__Query { - #![allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports)] - - extern crate lalrpop_util as __lalrpop_util; - #[allow(dead_code)] - pub enum __Symbol<'input> { - Term_22INSERT_22(&'input str), - Termr_23_22_28_3fi_29_5ba_2dz_5d_2b_22_23(&'input str), - Termr_23_22_28_3fi_29select_22_23(&'input str), - TermUPDATE(&'input str), - NtKeyword(String), - NtQuery(String), - NtTable(String), - Nt____Query(String), - } - const __ACTION: &'static [i32] = &[ - // State 0 - // Keyword = (*) "INSERT" ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // Keyword = (*) r#"(?i)select"# ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // Keyword = (*) UPDATE ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // Query = (*) Keyword Table ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // __Query = (*) Query ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - 4, // on "INSERT", goto 3 - 0, // on r#"(?i)[a-z]+"#, error - 5, // on r#"(?i)select"#, goto 4 - 6, // on UPDATE, goto 5 - - // State 1 - // Query = Keyword (*) Table ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - // Table = (*) r#"(?i)[a-z]+"# ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - 0, // on "INSERT", error - 8, // on r#"(?i)[a-z]+"#, goto 7 - 0, // on r#"(?i)select"#, error - 0, // on UPDATE, error - - // State 2 - // __Query = Query (*) ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - -6, // on "INSERT", reduce `__Query = Query => ActionFn(0);` - -6, // on r#"(?i)[a-z]+"#, reduce `__Query = Query => ActionFn(0);` - -6, // on r#"(?i)select"#, reduce `__Query = Query => ActionFn(0);` - -6, // on UPDATE, reduce `__Query = Query => ActionFn(0);` - - // State 3 - // Keyword = "INSERT" (*) ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - -2, // on "INSERT", reduce `Keyword = "INSERT" => ActionFn(2);` - -2, // on r#"(?i)[a-z]+"#, reduce `Keyword = "INSERT" => ActionFn(2);` - -2, // on r#"(?i)select"#, reduce `Keyword = "INSERT" => ActionFn(2);` - -2, // on UPDATE, reduce `Keyword = "INSERT" => ActionFn(2);` - - // State 4 - // Keyword = r#"(?i)select"# (*) ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - -1, // on "INSERT", reduce `Keyword = r#"(?i)select"# => ActionFn(1);` - -1, // on r#"(?i)[a-z]+"#, reduce `Keyword = r#"(?i)select"# => ActionFn(1);` - -1, // on r#"(?i)select"#, reduce `Keyword = r#"(?i)select"# => ActionFn(1);` - -1, // on UPDATE, reduce `Keyword = r#"(?i)select"# => ActionFn(1);` - - // State 5 - // Keyword = UPDATE (*) ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - -3, // on "INSERT", reduce `Keyword = UPDATE => ActionFn(3);` - -3, // on r#"(?i)[a-z]+"#, reduce `Keyword = UPDATE => ActionFn(3);` - -3, // on r#"(?i)select"#, reduce `Keyword = UPDATE => ActionFn(3);` - -3, // on UPDATE, reduce `Keyword = UPDATE => ActionFn(3);` - - // State 6 - // Query = Keyword Table (*) ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - -4, // on "INSERT", reduce `Query = Keyword, Table => ActionFn(5);` - -4, // on r#"(?i)[a-z]+"#, reduce `Query = Keyword, Table => ActionFn(5);` - -4, // on r#"(?i)select"#, reduce `Query = Keyword, Table => ActionFn(5);` - -4, // on UPDATE, reduce `Query = Keyword, Table => ActionFn(5);` - - // State 7 - // Table = r#"(?i)[a-z]+"# (*) ["INSERT", r#"(?i)[a-z]+"#, r#"(?i)select"#, UPDATE, EOF] - -5, // on "INSERT", reduce `Table = r#"(?i)[a-z]+"# => ActionFn(4);` - -5, // on r#"(?i)[a-z]+"#, reduce `Table = r#"(?i)[a-z]+"# => ActionFn(4);` - -5, // on r#"(?i)select"#, reduce `Table = r#"(?i)[a-z]+"# => ActionFn(4);` - -5, // on UPDATE, reduce `Table = r#"(?i)[a-z]+"# => ActionFn(4);` - - ]; - const __EOF_ACTION: &'static [i32] = &[ - 0, // on EOF, error - - 0, // on EOF, error - - -6, // on EOF, reduce `__Query = Query => ActionFn(0);` - - -2, // on EOF, reduce `Keyword = "INSERT" => ActionFn(2);` - - -1, // on EOF, reduce `Keyword = r#"(?i)select"# => ActionFn(1);` - - -3, // on EOF, reduce `Keyword = UPDATE => ActionFn(3);` - - -4, // on EOF, reduce `Query = Keyword, Table => ActionFn(5);` - - -5, // on EOF, reduce `Table = r#"(?i)[a-z]+"# => ActionFn(4);` - - ]; - const __GOTO: &'static [i32] = &[ - // State 0 - 2, // on Keyword, goto 1 - 3, // on Query, goto 2 - 0, // on Table, error - 0, // on __Query, error - - // State 1 - 0, // on Keyword, error - 0, // on Query, error - 7, // on Table, goto 6 - 0, // on __Query, error - - // State 2 - 0, // on Keyword, error - 0, // on Query, error - 0, // on Table, error - 0, // on __Query, error - - // State 3 - 0, // on Keyword, error - 0, // on Query, error - 0, // on Table, error - 0, // on __Query, error - - // State 4 - 0, // on Keyword, error - 0, // on Query, error - 0, // on Table, error - 0, // on __Query, error - - // State 5 - 0, // on Keyword, error - 0, // on Query, error - 0, // on Table, error - 0, // on __Query, error - - // State 6 - 0, // on Keyword, error - 0, // on Query, error - 0, // on Table, error - 0, // on __Query, error - - // State 7 - 0, // on Keyword, error - 0, // on Query, error - 0, // on Table, error - 0, // on __Query, error - - ]; - fn __expected_tokens(__state: usize) -> Vec<::std::string::String> { - const __TERMINAL: &'static [&'static str] = &[ - r###""INSERT""###, - r###"r#"(?i)[a-z]+"#"###, - r###"r#"(?i)select"#"###, - r###"UPDATE"###, - ]; - __ACTION[(__state * 4)..].iter().zip(__TERMINAL).filter_map(|(&state, terminal)| { - if state == 0 { - None - } else { - Some(terminal.to_string()) - } - }).collect() - } - pub fn parse_Query< - 'input, - >( - input: &'input str, - ) -> Result> - { - let mut __tokens = super::super::super::__intern_token::__Matcher::new(input); - let mut __states = vec![0_i32]; - let mut __symbols = vec![]; - let mut __integer; - let mut __lookahead; - let mut __last_location = Default::default(); - '__shift: loop { - __lookahead = match __tokens.next() { - Some(Ok(v)) => v, - None => break '__shift, - Some(Err(e)) => return Err(e), - }; - __last_location = __lookahead.2.clone(); - __integer = match __lookahead.1 { - (1, _) if true => 0, - (0, _) if true => 1, - (2, _) if true => 2, - (3, _) if true => 3, - _ => { - let __state = *__states.last().unwrap() as usize; - let __error = __lalrpop_util::ParseError::UnrecognizedToken { - token: Some(__lookahead), - expected: __expected_tokens(__state), - }; - return Err(__error); - } - }; - '__inner: loop { - let __state = *__states.last().unwrap() as usize; - let __action = __ACTION[__state * 4 + __integer]; - if __action > 0 { - let __symbol = match __integer { - 0 => match __lookahead.1 { - (1, __tok0) => __Symbol::Term_22INSERT_22((__tok0)), - _ => unreachable!(), - }, - 1 => match __lookahead.1 { - (0, __tok0) => __Symbol::Termr_23_22_28_3fi_29_5ba_2dz_5d_2b_22_23((__tok0)), - _ => unreachable!(), - }, - 2 => match __lookahead.1 { - (2, __tok0) => __Symbol::Termr_23_22_28_3fi_29select_22_23((__tok0)), - _ => unreachable!(), - }, - 3 => match __lookahead.1 { - (3, __tok0) => __Symbol::TermUPDATE((__tok0)), - _ => unreachable!(), - }, - _ => unreachable!(), - }; - __states.push(__action - 1); - __symbols.push((__lookahead.0, __symbol, __lookahead.2)); - continue '__shift; - } else if __action < 0 { - if let Some(r) = __reduce(input, __action, Some(&__lookahead.0), &mut __states, &mut __symbols, ::std::marker::PhantomData::<()>) { - return r; - } - } else { - let __state = *__states.last().unwrap() as usize; - let __error = __lalrpop_util::ParseError::UnrecognizedToken { - token: Some(__lookahead), - expected: __expected_tokens(__state), - }; - return Err(__error) - } - } - } - loop { - let __state = *__states.last().unwrap() as usize; - let __action = __EOF_ACTION[__state]; - if __action < 0 { - if let Some(r) = __reduce(input, __action, None, &mut __states, &mut __symbols, ::std::marker::PhantomData::<()>) { - return r; - } - } else { - let __state = *__states.last().unwrap() as usize; - let __error = __lalrpop_util::ParseError::UnrecognizedToken { - token: None, - expected: __expected_tokens(__state), - }; - return Err(__error); - } - } - } - pub fn __reduce< - 'input, - >( - input: &'input str, - __action: i32, - __lookahead_start: Option<&usize>, - __states: &mut ::std::vec::Vec, - __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>, - _: ::std::marker::PhantomData<()>, - ) -> Option>> - { - let __nonterminal = match -__action { - 1 => { - // Keyword = r#"(?i)select"# => ActionFn(1); - let __sym0 = __pop_Termr_23_22_28_3fi_29select_22_23(__symbols); - let __start = __sym0.0.clone(); - let __end = __sym0.2.clone(); - let __nt = super::super::super::__action1::<>(input, __sym0); - let __states_len = __states.len(); - __states.truncate(__states_len - 1); - __symbols.push((__start, __Symbol::NtKeyword(__nt), __end)); - 0 - } - 2 => { - // Keyword = "INSERT" => ActionFn(2); - let __sym0 = __pop_Term_22INSERT_22(__symbols); - let __start = __sym0.0.clone(); - let __end = __sym0.2.clone(); - let __nt = super::super::super::__action2::<>(input, __sym0); - let __states_len = __states.len(); - __states.truncate(__states_len - 1); - __symbols.push((__start, __Symbol::NtKeyword(__nt), __end)); - 0 - } - 3 => { - // Keyword = UPDATE => ActionFn(3); - let __sym0 = __pop_TermUPDATE(__symbols); - let __start = __sym0.0.clone(); - let __end = __sym0.2.clone(); - let __nt = super::super::super::__action3::<>(input, __sym0); - let __states_len = __states.len(); - __states.truncate(__states_len - 1); - __symbols.push((__start, __Symbol::NtKeyword(__nt), __end)); - 0 - } - 4 => { - // Query = Keyword, Table => ActionFn(5); - let __sym1 = __pop_NtTable(__symbols); - let __sym0 = __pop_NtKeyword(__symbols); - let __start = __sym0.0.clone(); - let __end = __sym1.2.clone(); - let __nt = super::super::super::__action5::<>(input, __sym0, __sym1); - let __states_len = __states.len(); - __states.truncate(__states_len - 2); - __symbols.push((__start, __Symbol::NtQuery(__nt), __end)); - 1 - } - 5 => { - // Table = r#"(?i)[a-z]+"# => ActionFn(4); - let __sym0 = __pop_Termr_23_22_28_3fi_29_5ba_2dz_5d_2b_22_23(__symbols); - let __start = __sym0.0.clone(); - let __end = __sym0.2.clone(); - let __nt = super::super::super::__action4::<>(input, __sym0); - let __states_len = __states.len(); - __states.truncate(__states_len - 1); - __symbols.push((__start, __Symbol::NtTable(__nt), __end)); - 2 - } - 6 => { - // __Query = Query => ActionFn(0); - let __sym0 = __pop_NtQuery(__symbols); - let __start = __sym0.0.clone(); - let __end = __sym0.2.clone(); - let __nt = super::super::super::__action0::<>(input, __sym0); - return Some(Ok(__nt)); - } - _ => panic!("invalid action code {}", __action) - }; - let __state = *__states.last().unwrap() as usize; - let __next_state = __GOTO[__state * 4 + __nonterminal] - 1; - __states.push(__next_state); - None - } - fn __pop_Term_22INSERT_22< - 'input, - >( - __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> - ) -> (usize, &'input str, usize) { - match __symbols.pop().unwrap() { - (__l, __Symbol::Term_22INSERT_22(__v), __r) => (__l, __v, __r), - _ => panic!("symbol type mismatch") - } - } - fn __pop_Termr_23_22_28_3fi_29_5ba_2dz_5d_2b_22_23< - 'input, - >( - __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> - ) -> (usize, &'input str, usize) { - match __symbols.pop().unwrap() { - (__l, __Symbol::Termr_23_22_28_3fi_29_5ba_2dz_5d_2b_22_23(__v), __r) => (__l, __v, __r), - _ => panic!("symbol type mismatch") - } - } - fn __pop_Termr_23_22_28_3fi_29select_22_23< - 'input, - >( - __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> - ) -> (usize, &'input str, usize) { - match __symbols.pop().unwrap() { - (__l, __Symbol::Termr_23_22_28_3fi_29select_22_23(__v), __r) => (__l, __v, __r), - _ => panic!("symbol type mismatch") - } - } - fn __pop_TermUPDATE< - 'input, - >( - __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> - ) -> (usize, &'input str, usize) { - match __symbols.pop().unwrap() { - (__l, __Symbol::TermUPDATE(__v), __r) => (__l, __v, __r), - _ => panic!("symbol type mismatch") - } - } - fn __pop_NtKeyword< - 'input, - >( - __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> - ) -> (usize, String, usize) { - match __symbols.pop().unwrap() { - (__l, __Symbol::NtKeyword(__v), __r) => (__l, __v, __r), - _ => panic!("symbol type mismatch") - } - } - fn __pop_NtQuery< - 'input, - >( - __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> - ) -> (usize, String, usize) { - match __symbols.pop().unwrap() { - (__l, __Symbol::NtQuery(__v), __r) => (__l, __v, __r), - _ => panic!("symbol type mismatch") - } - } - fn __pop_NtTable< - 'input, - >( - __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> - ) -> (usize, String, usize) { - match __symbols.pop().unwrap() { - (__l, __Symbol::NtTable(__v), __r) => (__l, __v, __r), - _ => panic!("symbol type mismatch") - } - } - fn __pop_Nt____Query< - 'input, - >( - __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)> - ) -> (usize, String, usize) { - match __symbols.pop().unwrap() { - (__l, __Symbol::Nt____Query(__v), __r) => (__l, __v, __r), - _ => panic!("symbol type mismatch") - } - } - } - pub use self::__parse__Query::parse_Query; - } -} -pub use self::__parse__Query::parse_Query; -mod __intern_token { - extern crate lalrpop_util as __lalrpop_util; - extern crate regex as __regex; - pub struct __Matcher<'input> { - text: &'input str, - consumed: usize, - regex_set: __regex::RegexSet, - regex_vec: Vec<__regex::Regex>, - } - - impl<'input> __Matcher<'input> { - pub fn new(s: &'input str) -> __Matcher<'input> { - let __strs: &[&str] = &[ - "^(?u:[A-Za-zſ-ſK-K])+", - "^(?iu:insert)", - "^(?iu:select)", - "^(?iu:update)", - ]; - let __regex_set = __regex::RegexSet::new(__strs).unwrap(); - let __regex_vec = vec![ - __regex::Regex::new("^(?u:[A-Za-zſ-ſK-K])+").unwrap(), - __regex::Regex::new("^(?iu:insert)").unwrap(), - __regex::Regex::new("^(?iu:select)").unwrap(), - __regex::Regex::new("^(?iu:update)").unwrap(), - ]; - __Matcher { - text: s, - consumed: 0, - regex_set: __regex_set, - regex_vec: __regex_vec, - } - } - } - - impl<'input> Iterator for __Matcher<'input> { - type Item = Result<(usize, (usize, &'input str), usize), __lalrpop_util::ParseError>; - - fn next(&mut self) -> Option { - let __text = self.text.trim_left(); - let __whitespace = self.text.len() - __text.len(); - let __start_offset = self.consumed + __whitespace; - if __text.is_empty() { - self.text = __text; - self.consumed = __start_offset; - None - } else { - let __matches = self.regex_set.matches(__text); - if !__matches.matched_any() { - Some(Err(__lalrpop_util::ParseError::InvalidToken { - location: __start_offset, - })) - } else { - let mut __longest_match = 0; - let mut __index = 0; - for __i in 0 .. 4 { - if __matches.matched(__i) { - let __match = self.regex_vec[__i].find(__text).unwrap(); - let __len = __match.end(); - if __len >= __longest_match { - __longest_match = __len; - __index = __i; - } - } - } - let __result = &__text[..__longest_match]; - let __remaining = &__text[__longest_match..]; - let __end_offset = __start_offset + __longest_match; - self.text = __remaining; - self.consumed = __end_offset; - Some(Ok((__start_offset, (__index, __result), __end_offset))) - } - } - } - } -} - -#[allow(unused_variables)] -pub fn __action0< - 'input, ->( - input: &'input str, - (_, __0, _): (usize, String, usize), -) -> String -{ - (__0) -} - -#[allow(unused_variables)] -pub fn __action1< - 'input, ->( - input: &'input str, - (_, __0, _): (usize, &'input str, usize), -) -> String -{ - String::from("SELECT") -} - -#[allow(unused_variables)] -pub fn __action2< - 'input, ->( - input: &'input str, - (_, __0, _): (usize, &'input str, usize), -) -> String -{ - String::from("INSERT") -} - -#[allow(unused_variables)] -pub fn __action3< - 'input, ->( - input: &'input str, - (_, __0, _): (usize, &'input str, usize), -) -> String -{ - String::from("UPDATE") -} - -#[allow(unused_variables)] -pub fn __action4< - 'input, ->( - input: &'input str, - (_, __0, _): (usize, &'input str, usize), -) -> String -{ - String::from(__0) -} - -#[allow(unused_variables)] -pub fn __action5< - 'input, ->( - input: &'input str, - (_, __0, _): (usize, String, usize), - (_, __1, _): (usize, String, usize), -) -> String -{ - format!("{} {}", __0, __1) -} - -pub trait __ToTriple<'input, > { - type Error; - fn to_triple(value: Self) -> Result<(usize,(usize, &'input str),usize),Self::Error>; -} - -impl<'input, > __ToTriple<'input, > for (usize, (usize, &'input str), usize) { - type Error = (); - fn to_triple(value: Self) -> Result<(usize,(usize, &'input str),usize),()> { - Ok(value) - } -} -impl<'input, > __ToTriple<'input, > for Result<(usize, (usize, &'input str), usize),()> { - type Error = (); - fn to_triple(value: Self) -> Result<(usize,(usize, &'input str),usize),()> { - value - } -} diff --git a/lalrpop-util/Cargo.toml b/lalrpop-util/Cargo.toml index 51f81aa..17f4655 100644 --- a/lalrpop-util/Cargo.toml +++ b/lalrpop-util/Cargo.toml @@ -3,6 +3,6 @@ name = "lalrpop-util" description = "Runtime library for parsers generated by LALRPOP" repository = "https://github.com/nikomatsakis/lalrpop" license = "Apache-2.0/MIT" -version = "0.12.5" # LALRPOP +version = "0.13.0" # LALRPOP authors = ["Niko Matsakis "] workspace = ".." diff --git a/lalrpop/Cargo.toml b/lalrpop/Cargo.toml index 4c03f68..fdc6f91 100644 --- a/lalrpop/Cargo.toml +++ b/lalrpop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lalrpop" -version = "0.12.5" # LALRPOP +version = "0.13.0" # LALRPOP description = "convenient LR(1) parser generator" repository = "https://github.com/nikomatsakis/lalrpop" readme = "../README.md" @@ -33,12 +33,12 @@ rand = "0.3" [dependencies.lalrpop-util] path = "../lalrpop-util" -version = "0.12.5" # LALRPOP +version = "0.13.0" # LALRPOP [dependencies.lalrpop-intern] path = "../lalrpop-intern" -version = "0.12.5" # LALRPOP +version = "0.13.0" # LALRPOP [build-dependencies.lalrpop-snap] path = "../lalrpop-snap" -version = "0.12.5" # LALRPOP +version = "0.13.0" # LALRPOP diff --git a/version.sh b/version.sh index add9b19..683186f 100755 --- a/version.sh +++ b/version.sh @@ -8,5 +8,23 @@ if [ "$1" == "" ]; then exit 1 fi +VERSION=$( + ls lalrpop*/Cargo.toml | \ + xargs grep "# LALRPOP$" | \ + perl -p -e 's/.*version = "([0-9.]+)" # LALRPOP$/$1/' | + sort | + uniq) + +if [ $(echo $VERSION | wc -w) != 1 ]; then + echo "Error: inconsistent versions detected across Cargo.toml files!" + echo "$VERSION" + exit 1 +fi + +echo "Found consistent version $VERSION" + perl -p -i -e 's/version *= *"[0-9.]+" # LALRPOP$/version = "'$1'" # LALRPOP/' \ $(ls lalrpop*/Cargo.toml) + +perl -p -i -e 's/version *= *"'$VERSION'"$/version = "'$1'"/' \ + $(find doc -name Cargo.toml)