2.12.2021, 9:00 - 11:00: Due to updates GitLab may be unavailable for some minutes between 09:00 and 11:00.

LaTeX.ebnf 4.68 KB
Newer Older
Eckhart Arnold's avatar
Eckhart Arnold committed
1
# LaTeX-Grammar for DHParser
Eckhart Arnold's avatar
Eckhart Arnold committed
2

3
@ testing    = True
4
@ whitespace = /[ \t]*(?:\n(?![ \t]*\n)[ \t]*)?/    # optional whitespace, including at most one linefeed
5
@ comment    = /%.*(?:\n|$)/
Eckhart Arnold's avatar
Eckhart Arnold committed
6

7

Eckhart Arnold's avatar
Eckhart Arnold committed
8
9
10
11
12
latexdoc       = preamble document
preamble       = { command }+

document       = [PARSEP] "\begin{document}" [PARSEP]
                 frontpages [PARSEP]
13
14
                 (Chapters | Sections) [PARSEP]
                 [Bibliography] [Index] [PARSEP]
Eckhart Arnold's avatar
Eckhart Arnold committed
15
16
17
                 "\end{document}" [PARSEP] §EOF
frontpages     = sequence

Eckhart Arnold's avatar
Eckhart Arnold committed
18
19
20
21
22
23
24

#######################################################################
#
# document structure
#
#######################################################################

Eckhart Arnold's avatar
Eckhart Arnold committed
25
26
Chapters       = { Chapter [PARSEP] }+
Chapter        = "\Chapter" block [PARSEP] { sequence | Sections }
Eckhart Arnold's avatar
Eckhart Arnold committed
27

Eckhart Arnold's avatar
Eckhart Arnold committed
28
29
Sections       = { Section [PARSEP] }+
Section        = "\Section" block [PARSEP] { sequence | SubSections }
Eckhart Arnold's avatar
Eckhart Arnold committed
30

Eckhart Arnold's avatar
Eckhart Arnold committed
31
32
SubSections    = { SubSection [PARSEP] }+
SubSection     = "\SubSection" block [PARSEP] { sequence | SubSubSections }
Eckhart Arnold's avatar
Eckhart Arnold committed
33

34
SubSubSections = { SubSubSection [PARSEP] }+
Eckhart Arnold's avatar
Eckhart Arnold committed
35
36
SubSubSection  = "\SubSubSection" block [PARSEP] { sequence | Paragraphs }

Eckhart Arnold's avatar
Eckhart Arnold committed
37
38
Paragraphs     = { Paragraph [PARSEP] }+
Paragraph      = "\paragraph" block [PARSEP] { sequence | SubParagraphs }
Eckhart Arnold's avatar
Eckhart Arnold committed
39

Eckhart Arnold's avatar
Eckhart Arnold committed
40
41
SubParagraphs  = { SubParagraph [PARSEP] }+
SubParagraph   = "\subparagpaph" block [PARSEP] { sequence }
Eckhart Arnold's avatar
Eckhart Arnold committed
42

43
44
Bibliography   = "\bibliography" block [PARSEP]
Index          = "\printindex" [PARSEP]
Eckhart Arnold's avatar
Eckhart Arnold committed
45
46
47
48
49
50
51


#######################################################################
#
# document content
#
#######################################################################
52

Eckhart Arnold's avatar
Eckhart Arnold committed
53

Eckhart Arnold's avatar
Eckhart Arnold committed
54
55
56
#### block environments ####

block_enrivonment   = known_enrivonment | generic_enrivonment
57
58
known_enrivonment   = itemize | enumerate | figure | table | quotation
                    | verbatim
Eckhart Arnold's avatar
Eckhart Arnold committed
59
60
61
62
63
64
generic_enrivonment = begin_enrivonment sequence §end_enrivonment

itemize             = "\begin{itemize}" [PARSEP] { item } §"\end{itemize}"
enumerate           = "\begin{enumerate}" [PARSEP] {item } §"end{enumerate}"
item                = "\item" [PARSEP] sequence

65
66
67
68
69
70
71
figure              = "\begin{figure}" sequence "\end{figure}"
quotation           = ("\begin{quotation}" sequence "\end{quotation}")
                    | ("\begin{quote}" sequence "\end{quote}")
verbatim            = "\begin{verbatim}" sequence "\end{verbatim}"
table               = "\begin{tabular}" table_config sequence "\end{tabular}"
table_config        = "{" /[lcr|]+/~ "}"

Eckhart Arnold's avatar
Eckhart Arnold committed
72
73
74
75
76
77

#### paragraphs and sequences of paragraphs ####

block_of_paragraphs = /{/ sequence §/}/
sequence            = { (paragraph | block_enrivonment ) [PARSEP] }+

78
79
paragraph           = { !blockcmd text_elements //~ }+
text_elements       = command | text | block | inline_enrivonment
Eckhart Arnold's avatar
Eckhart Arnold committed
80
81
82
83
84
85


#### inline enivronments ####

inline_enrivonment  = known_inline_env | generic_inline_env
known_inline_env    = inline_math
86
generic_inline_env  = begin_enrivonment { text_elements }+ §end_enrivonment
Eckhart Arnold's avatar
Eckhart Arnold committed
87
88
89
begin_enrivonment   = "\begin{" §NAME §"}"
end_enrivonment     = "\end{" §::NAME §"}"

90
inline_math         = "$" MATH "$"
Eckhart Arnold's avatar
Eckhart Arnold committed
91
92
93


#### commands ####
Eckhart Arnold's avatar
Eckhart Arnold committed
94

95
command             = known_command | generic_command
Eckhart Arnold's avatar
Eckhart Arnold committed
96
97
known_command       = footnote
generic_command     = CMDNAME [[ //~ config ] //~ block ]
Eckhart Arnold's avatar
Eckhart Arnold committed
98

Eckhart Arnold's avatar
Eckhart Arnold committed
99
100
101
102
103
104
105
106
footnote            = "\footnote" block_of_paragraphs


#######################################################################
#
# low-level text and character sequences
#
#######################################################################
107

108
config     = "[" cfgtext §"]"
109
block      = /{/ { text_elements } §/}/
Eckhart Arnold's avatar
Eckhart Arnold committed
110

111
112
113
text       = { cfgtext | (BRACKETS //~) }+
cfgtext    = { word_sequence | (ESCAPED //~) }+
word_sequence = { TEXTCHUNK //~ }+
114
115

blockcmd   = "\subsection" | "\section" | "\chapter" | "\subsubsection"
116
117
118
           | "\paragraph" | "\subparagraph" | "\item"
           | "\begin{" ("enumerate" | "itemize" | "figure" | "quote"
                        | "quotation" | "tabular") "}"
119

Eckhart Arnold's avatar
Eckhart Arnold committed
120
121
122
123
124
125
126

#######################################################################
#
# Primitives
#
#######################################################################

127
CMDNAME    = /\\(?:(?!_)\w)+/~
128
NAME       = /\w+/~
129
MATH       = /[\w_^{}[\]]*/~
Eckhart Arnold's avatar
Eckhart Arnold committed
130

131
ESCAPED    = /\\[%$&_\/]/
132
133
134
135
136
137
138
BRACKETS   = /[\[\]]/                       # left or right square bracket: [ ]
TEXTCHUNK  = /[^\\%$&\{\}\[\]\s\n]+/        # some piece of text excluding whitespace,
                                            # linefeed and special characters
WSPC       = /[ \t]+/                       # (horizontal) whitespace
LF         = !PARSEP /[ \t]*\n[ \t]*/       # LF but not an empty line
PARSEP     = /[ \t]*(?:\n[ \t]*)+\n[ \t]*/  # at least one empty line, i.e.
                                            # [whitespace] linefeed [whitespace] linefeed
139
EOF        = !/./