44// You can obtain one at http://mozilla.org/MPL/2.0/.
55//
66// Copyright (c) 2024, Lukas Scheller lukasscheller@icloud.com
7+ use crate :: standard:: VHDLStandard ;
78use crate :: syntax:: node:: SyntaxNode ;
89use crate :: syntax:: { DesignFileSyntax , NodeKind } ;
910use crate :: tokens:: TokenStream ;
11+ use crate :: tokens:: Tokenizer ;
1012
1113mod builder;
1214pub mod diagnostics;
@@ -26,29 +28,50 @@ pub struct Parser {
2628 builder : builder:: NodeBuilder ,
2729 diagnostics : Vec < diagnostics:: ParserDiagnostic > ,
2830 unexpected_eof : bool ,
31+ standard : VHDLStandard ,
2932}
3033
3134impl Parser {
32- pub fn new ( token_stream : TokenStream ) -> Parser {
35+ pub ( crate ) fn new ( token_stream : TokenStream , standard : VHDLStandard ) -> Parser {
3336 Parser {
3437 token_stream,
3538 builder : builder:: NodeBuilder :: new ( ) ,
3639 diagnostics : Vec :: default ( ) ,
3740 unexpected_eof : false ,
41+ standard,
3842 }
3943 }
4044
45+ pub fn standard ( & self ) -> VHDLStandard {
46+ self . standard
47+ }
48+
4149 pub fn into_root ( self ) -> ( SyntaxNode , Vec < diagnostics:: ParserDiagnostic > ) {
4250 let ( green, diagnostics) = self . end ( ) ;
4351 ( SyntaxNode :: new_root ( green) , diagnostics)
4452 }
4553}
4654
47- /// Parse and return a VHDL file.
55+ /// Parse and return a VHDL file using the default VHDL standard.
56+ ///
57+ /// Use [`parse_with_standard`] to use a non-default VHDL standard.
4858pub fn parse (
4959 token_stream : impl Into < TokenStream > ,
5060) -> ( DesignFileSyntax , Vec < diagnostics:: ParserDiagnostic > ) {
51- let mut parser: Parser = Parser :: new ( token_stream. into ( ) ) ;
61+ let mut parser = Parser :: new ( token_stream. into ( ) , VHDLStandard :: default ( ) ) ;
62+ parser. design_file ( ) ;
63+ let ( syntax_node, diagnostics) = parser. into_root ( ) ;
64+ debug_assert ! ( syntax_node. kind( ) == NodeKind :: DesignFile ) ;
65+ ( DesignFileSyntax ( syntax_node) , diagnostics)
66+ }
67+
68+ /// Parse and return a VHDL file, tokenizing and parsing under the given `standard`.
69+ pub fn parse_with_standard (
70+ standard : VHDLStandard ,
71+ input : impl IntoIterator < Item = u8 > ,
72+ ) -> ( DesignFileSyntax , Vec < diagnostics:: ParserDiagnostic > ) {
73+ let token_stream: TokenStream = Tokenizer :: with_standard ( standard, input. into_iter ( ) ) . collect ( ) ;
74+ let mut parser = Parser :: new ( token_stream, standard) ;
5275 parser. design_file ( ) ;
5376 let ( syntax_node, diagnostics) = parser. into_root ( ) ;
5477 debug_assert ! ( syntax_node. kind( ) == NodeKind :: DesignFile ) ;
@@ -60,7 +83,20 @@ pub(crate) fn parse_syntax(
6083 token_stream : impl Into < TokenStream > ,
6184 parser_fn : impl FnOnce ( & mut Parser ) ,
6285) -> ( SyntaxNode , Vec < diagnostics:: ParserDiagnostic > ) {
63- let mut parser: Parser = Parser :: new ( token_stream. into ( ) ) ;
86+ let mut parser = Parser :: new ( token_stream. into ( ) , VHDLStandard :: default ( ) ) ;
87+ parser_fn ( & mut parser) ;
88+ let ( green, diagnostics) = parser. end ( ) ;
89+ ( SyntaxNode :: new_root ( green) , diagnostics)
90+ }
91+
92+ #[ cfg( test) ]
93+ pub ( crate ) fn parse_syntax_with_standard (
94+ standard : VHDLStandard ,
95+ input : impl IntoIterator < Item = u8 > ,
96+ parser_fn : impl FnOnce ( & mut Parser ) ,
97+ ) -> ( SyntaxNode , Vec < diagnostics:: ParserDiagnostic > ) {
98+ let token_stream: TokenStream = Tokenizer :: with_standard ( standard, input. into_iter ( ) ) . collect ( ) ;
99+ let mut parser = Parser :: new ( token_stream, standard) ;
64100 parser_fn ( & mut parser) ;
65101 let ( green, diagnostics) = parser. end ( ) ;
66102 ( SyntaxNode :: new_root ( green) , diagnostics)
0 commit comments