Skip to content

Instantly share code, notes, and snippets.

@seandenigris
Last active July 8, 2021 11:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save seandenigris/7bcab08de166b7f385b360405ace1cd8 to your computer and use it in GitHub Desktop.
Save seandenigris/7bcab08de166b7f385b360405ace1cd8 to your computer and use it in GitHub Desktop.
%glr;
%prefix Le;
%root AnnotationParse;
%suffix Node;
%hierarchy Argument (
AlignmentArgument
CodeExpandedArgument
DbArgument
ExpandedArgument
FullArgument
HeightArgument
LabelArgument
NameArgument
NoCodeArgument
PageArgument
PreviewExpandedArgument
PreviewHeightArgument
PreviewShowArgument
ReturnArgument
ShowArgument
CitationLocationArgument
);
%hierarchy NameArgument (FileNameArgument ClassNameArgument WorkTitleArgument CitationLocationTypeArgument);
%hierarchy ClassNameArgument (MethodNameArgument);
%hierarchy Annotation (
ClassAnnotation
ExampleAnnotation
MethodAnnotation
ChangesAnnotation
PageAnnotation
CitationAnnotation
);
%excludes label path uuid;
%start ClassAnnotation ExampleAnnotation MethodAnnotation ChangesAnnotation PageAnnotation CitationAnnotation;
<className>
: <isUppercase> ( <isLetter> | _ | <isDigit> ) *
;
<unarySelector>
: (<isLetter> | _ ) ( <isLetter> | _ | <isDigit> ) *
;
<binarySelector>
: ([\~\-\!\@\%\&\*\+\=\?\/\>\<\,] |(\\ [\~\-\!\@\%\&\*\+\=\\\|\?\/\>\<\,])) +
;
<keywordSelector>
: (<unarySelector> \:)+
;
default path <selector>
: \#? <unarySelector>
| \#? <binarySelector>
| \#? <keywordSelector>
;
default path <integer>
: \d+
;
label <labelText>
: ([^\|\}\\] | (\\ .))* \\?
;
<whitespace>
: \s+
;
<name>
: name
;
default path <eq>
: \=
;
default path <label>
: label
;
<full>
: full
;
default path <expanded>
: expanded
;
default path <boolean>
: true
| false
;
default path <show>
: show
;
default path <height>
: height
;
default path <bar>
: \|
;
<return>
: return
;
<alignment>
: alignment
;
<previewShow>
: previewShow
;
<previewExpanded>
: previewExpanded
;
<previewHeight>
: previewHeight
;
<noCode>
: noCode
;
<gtgt>
: \>\>
;
<codeExpanded>
: codeExpanded
;
<documentWidth>
: documentWidth
;
<fullWidth>
: fullWidth
;
<paragraphWidth>
: paragraphWidth
;
<class>
: class
;
path <path>
: [^\|\}\=]+
;
path default <db>
: db
;
uuid <uuid>
: [0-9a-z]{1,25}
;
<locationType>
: locationType
;
<location>
: location
;
<locationText>
: \d+
;
<workTitleText>
: [^\|\}\=]+
;
<work>
: work
;
CitationAnnotation
: CitationAnnotationItems {{}}
;
CitationAnnotationItems
: CitationAnnotationItems <bar> 'separator' CitationAnnotationItem 'item'
| CitationAnnotationItem 'item'
;
CitationAnnotationItem
: WorkTitle
| CitationLocationType
| CitationLocation
;
CitationLocationType
: <locationType> 'name' <eq> 'equals' <className> 'value' {{CitationLocationTypeArgument}}
;
CitationLocation
: <location> 'name' <eq> 'equals' <locationText> 'value' {{CitationLocationArgument}}
;
WorkTitle
: <work> 'name' <eq> 'equals' <workTitleText> 'value' {{WorkTitleArgument}}
| <workTitleText> 'value' {{WorkTitleArgument}}
;
ClassAnnotation
: ClassAnnotationItems {{}}
;
ClassAnnotationItems
: ClassAnnotationItems <bar> 'separator' ClassAnnotationItem 'item'
| ClassAnnotationItem 'item'
;
ClassAnnotationItem
: ClassName
| Label
| Full
| Expanded
| Show
| Height
;
Height
: <height> 'name' <eq> 'equals' <integer> 'value' {{HeightArgument}}
;
Show
: <show> 'name' <eq> 'equals' <selector> 'value' {{ShowArgument}}
;
Expanded
: <expanded> 'name' OptionalBooleanValue {{ExpandedArgument}}
;
Full
: <full> 'name' OptionalBooleanValue {{FullArgument}}
;
Label
: <label> 'name' SwitchToLabel <eq> 'equals' SwitchToDefault <labelText> 'value' {{LabelArgument}}
;
SwitchToDefault
: [self scope: #default. nil]
;
SwitchToLabel
: [self scope: #label. nil]
;
ClassName
: <name> 'name' <eq> 'equals' <className> 'value' <class> 'classToken'? {{ClassNameArgument}}
| <className> 'value' <class> 'classToken'? {{ClassNameArgument}}
;
ExampleAnnotation
: ExampleAnnotationItems {{}}
;
ExampleAnnotationItems
: ExampleAnnotationItems <bar> 'separator' ExampleAnnotationItem 'item'
| ExampleAnnotationItem 'item'
;
ExampleAnnotationItem
: MethodName
| Expanded
| Label
| CodeExpanded
| NoCode
| PreviewHeight
| PreviewExpanded
| PreviewShow
| Alignment
| Return
;
Return
: <return> 'name' <eq> 'equals' <unarySelector> 'value' {{ReturnArgument}}
;
Alignment
: <alignment> 'name' <eq> 'equals' (<documentWidth> 'value' | <fullWidth> 'value' | <paragraphWidth> 'value') {{AlignmentArgument}}
;
PreviewShow
: <previewShow> 'name' <eq> 'equals' <selector> 'value' {{PreviewShowArgument}}
;
PreviewExpanded
: <previewExpanded> 'name' OptionalBooleanValue {{PreviewExpandedArgument}}
;
OptionalBooleanValue
: (<eq> 'equals' <boolean> 'value'?)?
;
PreviewHeight
: <previewHeight> 'name' <eq> 'equals' <integer> 'value' {{PreviewHeightArgument}}
;
NoCode
: <noCode> 'name' OptionalBooleanValue {{NoCodeArgument}}
;
CodeExpanded
: <codeExpanded> 'name' OptionalBooleanValue {{CodeExpandedArgument}}
;
MethodAnnotation
: MethodAnnotationItems {{}}
;
MethodAnnotationItems
: MethodAnnotationItems <bar> 'separator' MethodAnnotationItem 'item'
| MethodAnnotationItem 'item'
;
MethodAnnotationItem
: MethodName
| Label
| Expanded
| Show
| Height
;
MethodName
: (<name> 'name' <eq> 'equals')? <className> 'value' <class> 'classToken'? <gtgt> 'gtGt' <selector> 'selector' {{MethodNameArgument}}
;
ChangesAnnotation
: ChangesAnnotationItems {{}}
;
ChangesAnnotationItems
: ChangesAnnotationItems <bar> 'separator' ChangesAnnotationItem 'item'
| ChangesAnnotationItem 'item'
;
ChangesAnnotationItem
: Expanded
| Show
| Height
| Path
;
Path
: (<name> 'name' <eq> 'equals')? <path> 'value' {{FileNameArgument}}
;
PageAnnotation
: PageAnnotationItems {{}}
;
PageAnnotationItems
: PageAnnotationItems <bar> 'separator' PageAnnotationItem 'item'
| PageAnnotationItem 'item'
;
PageAnnotationItem
: PageLabel
| Db
;
Db
: <db> 'name' SwitchToUuid <eq> 'equals' SwitchToPath <uuid> 'value' {{DbArgument}}
;
SwitchToUuid
: [self scope: #uuid. nil]
;
SwitchToPath
: [self scope: #path. nil]
;
PageLabel
: <path> 'value' {{PageArgument}}
| <label> 'name' <eq> 'equals' <path> 'value' {{PageArgument}}
;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment