source/projects/datalog/src/datalog.peg

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