Extended BNF grammar for FCG
"?" means 0 or 1 times, "*" means 0 to N times, "+" means 1 to N times)
FCG := "~"? "[" Concept Branches? "]" Context?
Context := "(" Branch Branches? ")"
Branches := ("," Branch)+
Branch := Path_specif? Relation Concept
Path_specif := Path_term ("|" Path_term)*
Path_term := Path_factor Path_factor*
Path_factor := "(" Relation Concept? ")" Count
| "(" Path_specif ")" Count
Count := "?" | "*" | Number? "+" | Number
Relation := (RelationType|Coreference)
"of"? Annotation? Context? ("#"?":" | "<=")
| ("=>" | "<=>" | "<=" ) Concept
| ("=" | "!=" | "<" | "=<" | ">" | ">=" ) Concept
| "?" ":"
RelationType := Term_or_string
Coreference := "*" Term_or_number
Concept := ConceptCore Annotation?
| "(" ConceptCore Annotation? Branches? ")"
ConceptCore := CorefOrIndiv Quantifier Restrictor CQ?
| Quantifier Restrictor CorefOrIndiv? CQ?
| GroupOf Quantifier? Restrictor CorefDecl? (Collection|"?")?
| GroupOf Quantifier? CorefDecl? Collection
| (Number | "~"Coreference | CQ | CorefOrIndiv CQ?)
CorefOrIndiv := CorefDecl
| "named"? Term_or_string ("\\" ConceptType)?
//Term_or_string: individual (ex: Tom) or attribute (ex: high)
CorefDecl := "*"Term_or_number
| "*"Term_or_number "!=" "*"Term_or_number
| "*"Term_or_number "!=" Term_or_number
CQ := Collection | FCG | "?"
Restrictor := Qualifier? ConceptType
| Qualifier? "(" ConceptType Branches ")"
ConceptType := Term_or_string
Qualifier := "good"|"bad" | "important"|"small"|"big"|"great" | "certain"
Quantifier := "a" | "an" | "some" | "the"
| "any" | "every" | "most" "of"? "the"?
| "at" "least" Number "%"? "of"? "the"?
| "at" "most" Number "%"? "of"? "the"?
| "between" Number "%"? "and" Number "%"? "of"? "the"?
| Number "to" Number "%"? "of"? "the"?
| "from" Number "to" Number "%"? "of"? "the"?
| "mostly" | "several" "of"? "the"?
| Number "%"? "of"? "the"?
| ("many"|"few"|"dozens"|"hundreds"
|"thousands"|"millions"|"billions") "of"? "the"?
GroupOf := CorefOrIndiv?("a"|"the")("group""of" | "bag""of" |
"set""of"|"sequence""of"|"alternative")
| "together"
Collection := "{" (Set|Bag|OrderedSet|OrderedBag|XOR_Set|OR_Bag) "}" CollSize?
Set := Element ("," Element)*
Bag := Element ("&" Element)*
OrderedSet := Element ("<" Element)*
OrderedBag := Element ("=<" Element)*
XOR_Set := Element ("/" Element)*
OR_Bag := Element ("|" Element)*
Element := Concept | "*"
CollSize := "@" Number
Term_or_number:= Term | number
Term_or_string:= Term | string
Term := TermLetter1 TermLetter*
TermLetter1 := [a-z] | "#"[a-z]
TermLetter := [a-z] | "#" | "_" | "-" | "/" | "?" | "&" | "~"
| Digit
| [.?][a-z0-9?#~] //thus "." ok within a term but not at the end
| "://" //thus a URL may be a term
Number := ("+"|"-")? Digit+ ("." Digit* )?
Digit := [0-9]
//Additional notes on the lexical parsing:
- uppercase letters are parsed as if they were lowercase letters
- white spaces and the HTML imbreakable space encoding " " are ignored
- Java/C++ comments ("/* ... */" and "//...") are ignored
- HTML tags are ignored but the content of HTML comments is parsed
- annotations are enclosed within "(^" and "^)"
- strings may be single quoted, double quoted or enclosed within "$(" and ")$"