26 lines
1.2 KiB
Text
26 lines
1.2 KiB
Text
# A Datalog parser.
|
|
#
|
|
# The core entry point is the `dataset` rule, intended for parsing whole files.
|
|
#
|
|
# For convenience and consistency in implementing command shells `command` exists.
|
|
|
|
grammar Datalog
|
|
dataset <- (rule / comment / whitespace)* %make_dataset
|
|
rule <- clause (ws ":-" ws clauses)? "." %make_rule
|
|
clauses <- clause ("," ws clauses)? %make_clauses
|
|
clause <- negation? word "(" terms ")" %make_clause
|
|
negation <- "~"
|
|
terms <- term ("," ws terms)? %make_terms
|
|
term <- string / lvar / word
|
|
lvar <- [A-Z] [a-z0-9-_=<>]* %make_symbol
|
|
word <- [a-z0-9-_=<>]* %make_word
|
|
string <- sq_string / dq_string
|
|
sq_string <- "'" ([^']*) "'" %make_string
|
|
dq_string <- "\"" ([^\"]*) "\"" %make_string
|
|
ws <- (comment / whitespace)+
|
|
comment <- "%" ([^\n]*) "\n" %make_comment
|
|
whitespace <- [ \t\n]+ %make_ws
|
|
|
|
# And now for the helper productions
|
|
# These are NOT reached during normal grammar parsing
|
|
command <- clause (ws ":-" ws clauses)? ("." / "?" / "!") %make_command
|