sv_parser_parser/
lib.rs

1#![allow(clippy::many_single_char_names, clippy::module_inception)]
2
3pub mod keywords;
4#[macro_use]
5pub mod utils;
6pub(crate) use keywords::*;
7pub(crate) use utils::*;
8
9mod tests;
10
11pub mod behavioral_statements;
12pub mod declarations;
13pub mod expressions;
14pub mod general;
15pub mod instantiations;
16pub mod preprocessor;
17pub mod primitive_instances;
18pub mod source_text;
19pub mod specify_section;
20pub mod udp_declaration_and_instantiation;
21pub(crate) use behavioral_statements::*;
22pub(crate) use declarations::*;
23pub(crate) use expressions::*;
24pub(crate) use general::*;
25pub(crate) use instantiations::*;
26pub(crate) use preprocessor::*;
27pub(crate) use primitive_instances::*;
28pub(crate) use source_text::*;
29pub(crate) use specify_section::*;
30pub(crate) use udp_declaration_and_instantiation::*;
31
32pub(crate) use nom::branch::*;
33pub(crate) use nom::bytes::complete::*;
34pub(crate) use nom::character::complete::*;
35pub(crate) use nom::combinator::*;
36pub(crate) use nom::error::{context, make_error, ErrorKind};
37pub(crate) use nom::multi::*;
38pub(crate) use nom::sequence::*;
39pub(crate) use nom::Err;
40pub(crate) use nom_greedyerror::GreedyError;
41pub(crate) use nom_packrat::{self, packrat_parser, HasExtraState};
42pub(crate) use nom_recursive::{recursive_parser, HasRecursiveInfo, RecursiveInfo};
43pub(crate) use nom_tracable::tracable_parser;
44#[cfg(feature = "trace")]
45pub(crate) use nom_tracable::{HasTracableInfo, TracableInfo};
46pub(crate) use sv_parser_syntaxtree::*;
47
48// -----------------------------------------------------------------------------
49
50#[derive(Clone, Copy, Debug, Default, PartialEq)]
51pub struct SpanInfo {
52    #[cfg(feature = "trace")]
53    pub tracable_info: TracableInfo,
54    pub recursive_info: RecursiveInfo,
55}
56
57pub type Span<'a> = nom_locate::LocatedSpan<&'a str, SpanInfo>;
58pub type IResult<T, U> = nom::IResult<T, U, GreedyError<T, ErrorKind>>;
59
60impl HasRecursiveInfo for SpanInfo {
61    fn get_recursive_info(&self) -> RecursiveInfo {
62        self.recursive_info
63    }
64
65    fn set_recursive_info(mut self, info: RecursiveInfo) -> Self {
66        self.recursive_info = info;
67        self
68    }
69}
70
71#[cfg(feature = "trace")]
72impl HasTracableInfo for SpanInfo {
73    fn get_tracable_info(&self) -> TracableInfo {
74        self.tracable_info
75    }
76
77    fn set_tracable_info(mut self, info: TracableInfo) -> Self {
78        self.tracable_info = info;
79        self
80    }
81}
82
83impl HasExtraState<bool> for SpanInfo {
84    fn get_extra_state(&self) -> bool {
85        in_directive()
86    }
87}
88
89// -----------------------------------------------------------------------------
90
91nom_packrat::storage!(AnyNode, bool, 1024);
92
93pub fn sv_parser(s: Span) -> IResult<Span, SourceText> {
94    init();
95    source_text(s)
96}
97
98pub fn sv_parser_incomplete(s: Span) -> IResult<Span, SourceText> {
99    init();
100    source_text_incomplete(s)
101}
102
103pub fn lib_parser(s: Span) -> IResult<Span, LibraryText> {
104    init();
105    library_text(s)
106}
107
108pub fn lib_parser_incomplete(s: Span) -> IResult<Span, LibraryText> {
109    init();
110    library_text_incomplete(s)
111}
112
113pub fn pp_parser(s: Span) -> IResult<Span, PreprocessorText> {
114    init();
115    preprocessor_text(s)
116}
117
118fn init() {
119    nom_packrat::init!();
120    clear_directive();
121    clear_version();
122}