mirror of
https://github.com/yhirose/cpp-peglib.git
synced 2024-12-22 11:55:30 +00:00
Add cpp-peglib grammar extracted from peglib.h (#222)
This commit is contained in:
parent
fed85fe14d
commit
0366380091
145
grammar/cpp-peglib.peg
Normal file
145
grammar/cpp-peglib.peg
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
# Setup PEG syntax parser
|
||||||
|
Grammar <- Spacing Definition+ EndOfFile
|
||||||
|
|
||||||
|
Definition <-
|
||||||
|
Ignore IdentCont Parameters LEFTARROW Expression Instruction?
|
||||||
|
/ Ignore Identifier LEFTARROW Expression Instruction?
|
||||||
|
|
||||||
|
Expression <- Sequence (SLASH Sequence)*
|
||||||
|
|
||||||
|
Sequence <- (CUT / Prefix)*
|
||||||
|
|
||||||
|
Prefix <- (AND / NOT)? SuffixWithLabel
|
||||||
|
|
||||||
|
SuffixWithLabel <- Suffix (LABEL Identifier)?
|
||||||
|
|
||||||
|
Suffix <- Primary Loop?
|
||||||
|
|
||||||
|
Loop <- QUESTION / STAR / PLUS / Repetition
|
||||||
|
|
||||||
|
Primary <-
|
||||||
|
Ignore IdentCont Arguments !LEFTARROW
|
||||||
|
/ Ignore Identifier !(Parameters? LEFTARROW)
|
||||||
|
/ OPEN Expression CLOSE
|
||||||
|
/ BeginTok Expression EndTok
|
||||||
|
/ BeginCapScope Expression EndCapScope
|
||||||
|
/ BeginCap Expression EndCap
|
||||||
|
/ BackRef
|
||||||
|
/ LiteralI
|
||||||
|
/ Dictionary
|
||||||
|
/ Literal
|
||||||
|
/ NegatedClass
|
||||||
|
/ Class
|
||||||
|
/ DOT
|
||||||
|
|
||||||
|
Identifier <- IdentCont Spacing
|
||||||
|
|
||||||
|
IdentCont <- IdentStart IdentRest*
|
||||||
|
|
||||||
|
IdentStart <- !"↑" !"⇑" ([a-zA-Z_%] / [\u0080-\uFFFF])
|
||||||
|
|
||||||
|
IdentRest <- IdentStart / [0-9]
|
||||||
|
|
||||||
|
Dictionary <- LiteralD (PIPE LiteralD)+
|
||||||
|
|
||||||
|
lit_ope <-
|
||||||
|
['] <(!['] Char)*> ['] Spacing
|
||||||
|
/ ["] <(!["] Char)*> ["] Spacing
|
||||||
|
|
||||||
|
Literal <- lit_ope
|
||||||
|
|
||||||
|
LiteralD <- lit_ope
|
||||||
|
|
||||||
|
LiteralI <-
|
||||||
|
['] <(!['] Char)*> "'i" Spacing
|
||||||
|
/ ["] <(!["] Char)*> '"i' Spacing
|
||||||
|
|
||||||
|
# NOTE: The original Brian Ford's paper uses 'zom' instead of 'oom'.
|
||||||
|
Class <- '[' !'^' <(!']' Range)+> ']' Spacing
|
||||||
|
NegatedClass <- "[^" <(!']' Range)+> ']' Spacing
|
||||||
|
|
||||||
|
Range <- (Char '-' ! ']' Char) / Char
|
||||||
|
|
||||||
|
Char <-
|
||||||
|
'\\' [nrt'\"[\]\\^]
|
||||||
|
/ '\\' [0-3] [0-7] [0-7]
|
||||||
|
/ '\\' [0-7] [0-7]?
|
||||||
|
/ "\\x" [0-9a-fA-F] [0-9a-fA-F]?
|
||||||
|
/ "\\u" (((('0' [0-9a-fA-F]) / "10") [0-9a-fA-F]{4,4}) / [0-9a-fA-F]{4,5})
|
||||||
|
/ !'\\' .
|
||||||
|
|
||||||
|
Repetition <- BeginBlacket RepetitionRange EndBlacket
|
||||||
|
|
||||||
|
RepetitionRange <-
|
||||||
|
Number COMMA Number
|
||||||
|
/ Number COMMA
|
||||||
|
/ Number
|
||||||
|
/ COMMA Number
|
||||||
|
|
||||||
|
Number <- [0-9]+ Spacing
|
||||||
|
|
||||||
|
LEFTARROW <- ("<-" / "←") Spacing
|
||||||
|
|
||||||
|
~SLASH <- '/' Spacing
|
||||||
|
~PIPE <- '|' Spacing
|
||||||
|
AND <- '&' Spacing
|
||||||
|
NOT <- '!' Spacing
|
||||||
|
QUESTION <- '?' Spacing
|
||||||
|
STAR <- '*' Spacing
|
||||||
|
PLUS <- '+' Spacing
|
||||||
|
~OPEN <- '(' Spacing
|
||||||
|
~CLOSE <- ')' Spacing
|
||||||
|
DOT <- '.' Spacing
|
||||||
|
|
||||||
|
CUT <- "↑" Spacing
|
||||||
|
~LABEL <- ('^' / "⇑") Spacing
|
||||||
|
|
||||||
|
~Spacing <- (Space / Comment)*
|
||||||
|
Comment <- '#' (!EndOfLine . )*
|
||||||
|
Space <- ' ' / '\t' / EndOfLine
|
||||||
|
EndOfLine <- "\r\n" / '\n' / '\r'
|
||||||
|
EndOfFile <- ! .
|
||||||
|
|
||||||
|
~BeginTok <- '<' Spacing
|
||||||
|
~EndTok <- '>' Spacing
|
||||||
|
|
||||||
|
~BeginCapScope <- '$' '(' Spacing
|
||||||
|
~EndCapScope <- ')' Spacing
|
||||||
|
|
||||||
|
BeginCap <- '$' <IdentCont> '<' Spacing
|
||||||
|
~EndCap <- '>' Spacing
|
||||||
|
|
||||||
|
BackRef <- '$' <IdentCont> Spacing
|
||||||
|
|
||||||
|
IGNORE <- '~'
|
||||||
|
|
||||||
|
Ignore <- IGNORE?
|
||||||
|
Parameters <- OPEN Identifier (COMMA Identifier)* CLOSE
|
||||||
|
Arguments <- OPEN Expression (COMMA Expression)* CLOSE
|
||||||
|
~COMMA <- ',' Spacing
|
||||||
|
|
||||||
|
# Instruction grammars
|
||||||
|
Instruction <-
|
||||||
|
BeginBlacket (InstructionItem (InstructionItemSeparator InstructionItem)*)? EndBlacket
|
||||||
|
InstructionItem <- PrecedenceClimbing / ErrorMessage / NoAstOpt
|
||||||
|
~InstructionItemSeparator <- ';' Spacing
|
||||||
|
|
||||||
|
~SpacesZom <- Space*
|
||||||
|
~SpacesOom <- Space+
|
||||||
|
~BeginBlacket <- '{' Spacing
|
||||||
|
~EndBlacket <- '}' Spacing
|
||||||
|
|
||||||
|
# PrecedenceClimbing instruction
|
||||||
|
PrecedenceClimbing <- "precedence" SpacesOom PrecedenceInfo (SpacesOom PrecedenceInfo)* SpacesZom
|
||||||
|
PrecedenceInfo <- PrecedenceAssoc (~SpacesOom PrecedenceOpe)+
|
||||||
|
PrecedenceOpe <-
|
||||||
|
['] <(!(Space / [']) Char)*> [']
|
||||||
|
/ ["] <(!(Space / ["]) Char)*> ["]
|
||||||
|
/ <(!(PrecedenceAssoc / Space / '}') . )+>
|
||||||
|
PrecedenceAssoc <- [LR]
|
||||||
|
|
||||||
|
# Error message instruction
|
||||||
|
ErrorMessage <- "message" SpacesOom LiteralD SpacesZom
|
||||||
|
|
||||||
|
# No Ast node optimazation instruction
|
||||||
|
NoAstOpt <- "no_ast_opt" SpacesZom
|
Loading…
Reference in New Issue
Block a user