Skip to content

Commit ab27e60

Browse files
committed
Use W3C's EBNF
The EBNF syntax isn't strictly defined and there exist many variants of it. This change makes FTL's grammar spec conform to the variant defined by W3C which they use in the XML and the XQuery spec: https://www.w3.org/TR/REC-xml/#sec-notation
1 parent 2abb8a7 commit ab27e60

File tree

2 files changed

+43
-40
lines changed

2 files changed

+43
-40
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,7 @@ Fluent Syntax (FTL)
44
Specification, design and documentation for FTL, the syntax for describing
55
translation resources in Project Fluent. FTL stands for _Fluent Translation
66
List_.
7+
8+
The grammar is defined using [W3C's EBNF][].
9+
10+
[W3C's EBNF]: https://www.w3.org/TR/REC-xml/#sec-notation

fluent.ebnf

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,49 @@
1-
body ::= (entry NL)* (entry)? EOF;
1+
body ::= (entry NL)* entry? EOF
22
entry ::= comment
3-
| section
4-
| message
5-
;
3+
| section
4+
| message
65

7-
comment ::= '#' .*;
8-
section ::= '[[' __ keyword __ ']]';
6+
comment ::= '#' char*
7+
section ::= '[[' __ keyword __ ']]'
98

10-
__ ::= [ \t]*;
11-
NL ::= [\r\n]+;
9+
char ::= [https://www.w3.org/TR/REC-xml/#NT-Char]
10+
__ ::= [#x20#x9]* /* space, tab */
11+
NL ::= [#xA#xD]+ /* line feed, carriage return */
1212

13-
identifier ::= [a-zA-Z_.?-] ([a-zA-Z0-9_.?-])*;
14-
variable ::= '$' identifier;
15-
keyword ::= [a-zA-Z_.?-] ([a-zA-Z0-9_.?- ]* [a-zA-Z0-9_.?-])?;
16-
builtin ::= [A-Z_.?-]+;
17-
number ::= [0-9]+ ('.' [0-9]+)?;
13+
identifier ::= [a-zA-Z_.?-] ([a-zA-Z0-9_.?-])*
14+
variable ::= '$' identifier
15+
keyword ::= [a-zA-Z_.?-] ([a-zA-Z0-9_.?- ]* [a-zA-Z0-9_.?-])?
16+
builtin ::= [A-Z_.?-]+
17+
number ::= [0-9]+ ('.' [0-9]+)?
1818

19-
member-key ::= number | (identifier '/')? keyword;
20-
member ::= '[' member-key ']' __ pattern NL;
21-
default-member ::= '*' member;
22-
variants-list ::= NL (__ member)* __ default-member (__ member)*;
23-
traits-list ::= variants-list | NL (__ member)+;
19+
member-key ::= number | (identifier '/')? keyword
20+
member ::= '[' member-key ']' __ pattern NL
21+
default-member ::= '*' member
22+
variants-list ::= NL (__ member)* __ default-member (__ member)*
23+
traits-list ::= variants-list | NL (__ member)+
2424

25-
message ::= identifier __ '=' __ (pattern | pattern traits-list | traits-list);
25+
message ::= identifier __ '=' __ (pattern | pattern traits-list | traits-list)
2626
pattern ::= unquoted-pattern
27-
| quoted-pattern
28-
;
29-
unquoted-pattern ::= (unquoted-text | placeable | block-text)+;
30-
quoted-pattern ::= '"' (quoted-text | placeable)* '"';
31-
unquoted-text ::= ([^{] | '\{')+;
32-
quoted-text ::= ([^{"] | '\{' | '\"')+;
33-
block-text ::= NL __ '|' unquoted-pattern;
27+
| quoted-pattern
28+
unquoted-pattern ::= (unquoted-text | placeable | block-text)+
29+
quoted-pattern ::= '"' (quoted-text | placeable)* '"'
30+
unquoted-text ::= ([^{] | '\{')+
31+
quoted-text ::= ([^{"] | '\{' | '\"')+
32+
block-text ::= NL __ '|' unquoted-pattern
3433

35-
placeable ::= '{' __ expression __ '}';
34+
placeable ::= '{' __ expression __ '}'
3635
expression ::= quoted-pattern
37-
| number
38-
| identifier
39-
| variable
40-
| select-expression
41-
| member-expression
42-
| call-expression
43-
;
44-
select-expression ::= expression __ ' ->' __ variants-list;
45-
member-expression ::= identifier '[' keyword ']';
46-
call-expression ::= builtin '(' __ arglist? __ ')';
47-
arglist ::= argument (__ ',' __ arglist)?;
36+
| number
37+
| identifier
38+
| variable
39+
| select-expression
40+
| member-expression
41+
| call-expression
42+
43+
select-expression ::= expression __ ' ->' __ variants-list
44+
member-expression ::= identifier '[' keyword ']'
45+
call-expression ::= builtin '(' __ arglist? __ ')'
46+
arglist ::= argument (__ ',' __ arglist)?
4847
argument ::= expression
49-
| keyword-argument;
50-
keyword-argument ::= identifier __ ':' __ quoted-pattern;
48+
| keyword-argument
49+
keyword-argument ::= identifier __ ':' __ quoted-pattern

0 commit comments

Comments
 (0)