import edu.berkeley.sbp.chr.*;
import edu.berkeley.sbp.misc.*;
import edu.berkeley.sbp.meta.*;
-import edu.berkeley.sbp.bind.*;
import edu.berkeley.sbp.util.*;
import java.util.*;
import java.io.*;
Parser.class.getClassLoader().getResourceAsStream("edu/berkeley/fleet/assembler/fleet.g");
CharParser metaGrammarParser = new CharParser(MetaGrammar.newInstance());
Tree<String> parsedGrammar = metaGrammarParser.parse(new CharInput(grammarStream)).expand1();
- grammar = Grammar.create(parsedGrammar, "s", new Grammar.Bindings() { public Object repeatTag() { return ""; } });
+ grammar = GrammarAST.buildFromAST(parsedGrammar, "s", new File[0]);
return grammar;
}
// the grammar. An equivalent lex+yacc grammar and support code would
// be several times as long.
-Comment = "//" ~[\n\r]* [\r\n]!
- | "/*" ~[\n\r]* "*/"
-ws = ([\r\n ] | Comment)* -> ~[\r\n ]
+Comment = "//" ~[\n\r]!* [\r\n]!
+ | "/*" ~[\n\r]!* "*/"
+ws = ([\r\n ] | Comment)!* -> ~[\r\n ]
s = ws! Program ws!
Program = Program:: Directive+/ws
- | Program:: (Directive+/ws) ws! CodeBagBody
+ | Program:: ("":: Directive+/ws) ws! CodeBagBody
-Statement = Fiber:: Source ":" (Instruction +/ ws) /ws
+Statement = Fiber:: Source ":" ("":: Instruction +/ ws) /ws
| Literal:: int ":" "sendto" Port ";" /ws
| ShipSpecificLiteral:: SSL ":" "sendto" Port ";" /ws
| CodeBagDescriptor:: CodeBag ":" "sendto" Port ";" /ws
| BrackStar:: "[*]"
| ParenStar:: "(*)"
Instruction = Instruction::
- (CountField ws!)?
- (Command +/ (ws! "," ws!) ws! ";"!)
+ ("":: (CountField ws!)?)
+ ("":: Command +/ (ws! "," ws!) ws! ";"!)
Command = Nop:: "nop"
| Kill:: "kill"
| KillStar:: "kill*"
| SubPort:: shipname "." portname "." portname
| ^"()"
-CodeBagBody = Statement +/ ws
+CodeBagBody:: = Statement +/ ws
CodeBag = CodeBagRef:: CodeBagName
| AnonymousCodeBag:: "{" CodeBagBody "}" /ws
CodeBagName = name
shipname = name
-shiptype = Name:: [A-Z] [A-Za-z0-9\[\]_]**
-ShipSpecificLiteral = Name:: [A-Z] [A-Z0-9\[\]_]**
-portname = Name:: [a-z] [A-Za-z0-9\[\]_]**
-name = Name:: [A-Za-z] [A-Za-z0-9\[\]_]**
-index = "[" [0-9]+ "]" | [0-9]+
-int = [\-0-9]++
+shiptype = Name:: [A-Z] ("":: [A-Za-z0-9\[\]_]**)
+ShipSpecificLiteral = Name:: [A-Z] ("":: [A-Z0-9\[\]_]**)
+portname = Name:: [a-z] ("":: [A-Za-z0-9\[\]_]**)
+name = Name:: [A-Za-z] ("":: [A-Za-z0-9\[\]_]**)
+index = "[" ("":: [0-9]+) "]" | ("":: [0-9]+)
+int = "":: [\-0-9]++
ShipSpecific = ShipSpecific:: "\"" ~[\"]++ "\""
// the following are not part of the official FLEET syntax and are
// specific to Adam's interpreter.
-Directive = Memory:: "#memory" "{" (int +/ (ws! "," ws!)) "}" /ws
+Directive = "#memory" "{" (Memory:: int +/ (ws! "," ws!)) "}" /ws
| Import:: "#import" [A-Za-z_.]++ /ws
- | Include:: "#include" ("\"" (~[\"])+ "\"") /ws
- | Ship:: "#ship" shipname ":" [0-9A-Za-z_.]++ /ws
+ | Include:: "#include" ws! "\"" ~[\"]+ "\""
+ | Ship:: "#ship" shipname ":" ("":: [0-9A-Za-z_.]++) /ws
| Expect:: "#expect" int /ws