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