diff --git a/src/grammars/HelloWorld.g4 b/src/grammars/HelloWorld.g4 deleted file mode 100644 index 5108ee9..0000000 --- a/src/grammars/HelloWorld.g4 +++ /dev/null @@ -1,3 +0,0 @@ -grammar HelloWorld; - -start: 'Hello, World!' EOF; \ No newline at end of file diff --git a/src/grammars/SoftwareRequirements.g4 b/src/grammars/SoftwareRequirements.g4 new file mode 100644 index 0000000..75458f7 --- /dev/null +++ b/src/grammars/SoftwareRequirements.g4 @@ -0,0 +1,36 @@ +grammar SoftwareRequirements; + +// Lexer rules +ID : [a-zA-Z]+ ; +STRING : '"' ~'"'* '"' ; +WS : [ \t\r\n]+ -> skip ; + +// Parser rules +program : (requirement | functionSpec)+ ; + +requirement : ID ':' predicate ';' ; + +predicate : expression '=>' expression ; + +expression : term (logical_op term)* ; + +term : '(' expression ')' + | STRING + ; + +logical_op : '&&' | '||' ; + +functionSpec : ID'()' ':' '(' parameter_list ')' ';' ; + +parameter_list : parameter (',' parameter)* ; + +parameter : STRING ':' STRING ; + +// Define symbols +LPAREN : '(' ; +RPAREN : ')' ; +COLON : ':' ; +SEMICOLON : ';' ; +COMMA : ',' ; +LBRACE : '{' ; +RBRACE : '}' ; diff --git a/src/main/java/org/lumijiez/Main.java b/src/main/java/org/lumijiez/Main.java index f0a8d82..a22f182 100644 --- a/src/main/java/org/lumijiez/Main.java +++ b/src/main/java/org/lumijiez/Main.java @@ -4,26 +4,32 @@ import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTreeWalker; -import org.lumijiez.parser.HelloWorldBaseListener; -import org.lumijiez.parser.HelloWorldLexer; -import org.lumijiez.parser.HelloWorldParser; +import org.lumijiez.parser.SoftwareRequirementsBaseListener; +import org.lumijiez.parser.SoftwareRequirementsLexer; +import org.lumijiez.parser.SoftwareRequirementsParser; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; public class Main { - public static void main(String[] args) { - String input = "Hello, World!"; + public static void main(String[] args) throws IOException, URISyntaxException { + String input = new String(Files.readAllBytes(Path.of(Objects.requireNonNull(Main.class.getResource("/TestProgram.txt")).toURI()))); + CharStream inputStream = CharStreams.fromString(input); - HelloWorldLexer lexer = new HelloWorldLexer(inputStream); + SoftwareRequirementsLexer lexer = new SoftwareRequirementsLexer(inputStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); - HelloWorldParser parser = new HelloWorldParser(tokenStream); + SoftwareRequirementsParser parser = new SoftwareRequirementsParser(tokenStream); ParseTreeWalker walker = new ParseTreeWalker(); - MyListener listener = new MyListener(); - walker.walk(listener, parser.start()); + SoftwareReqParseTree listener = new SoftwareReqParseTree(); + walker.walk(listener, parser.program()); } - static class MyListener extends HelloWorldBaseListener { + static class SoftwareReqParseTree extends SoftwareRequirementsBaseListener { @Override - public void enterStart(HelloWorldParser.StartContext ctx) { + public void enterProgram(SoftwareRequirementsParser.ProgramContext ctx) { System.out.println("Parsed: " + ctx.getText()); } } diff --git a/src/main/java/org/lumijiez/parser/HelloWorld.interp b/src/main/java/org/lumijiez/parser/HelloWorld.interp deleted file mode 100644 index 9dbbeab..0000000 --- a/src/main/java/org/lumijiez/parser/HelloWorld.interp +++ /dev/null @@ -1,14 +0,0 @@ -token literal names: -null -'Hello, World!' - -token symbolic names: -null -null - -rule names: -start - - -atn: -[4, 1, 1, 6, 2, 0, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 2, 1, 0, 0, 0, 2, 3, 5, 1, 0, 0, 3, 4, 5, 0, 0, 1, 4, 1, 1, 0, 0, 0, 0] \ No newline at end of file diff --git a/src/main/java/org/lumijiez/parser/HelloWorld.tokens b/src/main/java/org/lumijiez/parser/HelloWorld.tokens deleted file mode 100644 index 017a733..0000000 --- a/src/main/java/org/lumijiez/parser/HelloWorld.tokens +++ /dev/null @@ -1,2 +0,0 @@ -T__0=1 -'Hello, World!'=1 diff --git a/src/main/java/org/lumijiez/parser/HelloWorldBaseListener.java b/src/main/java/org/lumijiez/parser/HelloWorldBaseListener.java deleted file mode 100644 index 6f2695a..0000000 --- a/src/main/java/org/lumijiez/parser/HelloWorldBaseListener.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.lumijiez.parser;// Generated from D:/Source/JavaProjects/dsl-formal-requirements/src/grammars/HelloWorld.g4 by ANTLR 4.13.1 - -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.tree.ErrorNode; -import org.antlr.v4.runtime.tree.TerminalNode; - -/** - * This class provides an empty implementation of {@link HelloWorldListener}, - * which can be extended to create a listener which only needs to handle a subset - * of the available methods. - */ -@SuppressWarnings("CheckReturnValue") -public class HelloWorldBaseListener implements HelloWorldListener { - /** - * {@inheritDoc} - * - *
The default implementation does nothing.
- */ - @Override public void enterStart(HelloWorldParser.StartContext ctx) { } - /** - * {@inheritDoc} - * - *The default implementation does nothing.
- */ - @Override public void exitStart(HelloWorldParser.StartContext ctx) { } - - /** - * {@inheritDoc} - * - *The default implementation does nothing.
- */ - @Override public void enterEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *The default implementation does nothing.
- */ - @Override public void exitEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *The default implementation does nothing.
- */ - @Override public void visitTerminal(TerminalNode node) { } - /** - * {@inheritDoc} - * - *The default implementation does nothing.
- */ - @Override public void visitErrorNode(ErrorNode node) { } -} \ No newline at end of file diff --git a/src/main/java/org/lumijiez/parser/HelloWorldBaseVisitor.java b/src/main/java/org/lumijiez/parser/HelloWorldBaseVisitor.java deleted file mode 100644 index 9f4785d..0000000 --- a/src/main/java/org/lumijiez/parser/HelloWorldBaseVisitor.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.lumijiez.parser;// Generated from D:/Source/JavaProjects/dsl-formal-requirements/src/grammars/HelloWorld.g4 by ANTLR 4.13.1 -import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; - -/** - * This class provides an empty implementation of {@link HelloWorldVisitor}, - * which can be extended to create a visitor which only needs to handle a subset - * of the available methods. - * - * @paramThe default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.
- */ - @Override public T visitStart(HelloWorldParser.StartContext ctx) { return visitChildren(ctx); } -} \ No newline at end of file diff --git a/src/main/java/org/lumijiez/parser/HelloWorldLexer.interp b/src/main/java/org/lumijiez/parser/HelloWorldLexer.interp deleted file mode 100644 index ae94d2d..0000000 --- a/src/main/java/org/lumijiez/parser/HelloWorldLexer.interp +++ /dev/null @@ -1,20 +0,0 @@ -token literal names: -null -'Hello, World!' - -token symbolic names: -null -null - -rule names: -T__0 - -channel names: -DEFAULT_TOKEN_CHANNEL -HIDDEN - -mode names: -DEFAULT_MODE - -atn: -[4, 0, 1, 17, 6, -1, 2, 0, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 16, 0, 1, 1, 0, 0, 0, 1, 3, 1, 0, 0, 0, 3, 4, 5, 72, 0, 0, 4, 5, 5, 101, 0, 0, 5, 6, 5, 108, 0, 0, 6, 7, 5, 108, 0, 0, 7, 8, 5, 111, 0, 0, 8, 9, 5, 44, 0, 0, 9, 10, 5, 32, 0, 0, 10, 11, 5, 87, 0, 0, 11, 12, 5, 111, 0, 0, 12, 13, 5, 114, 0, 0, 13, 14, 5, 108, 0, 0, 14, 15, 5, 100, 0, 0, 15, 16, 5, 33, 0, 0, 16, 2, 1, 0, 0, 0, 1, 0, 0] \ No newline at end of file diff --git a/src/main/java/org/lumijiez/parser/HelloWorldLexer.java b/src/main/java/org/lumijiez/parser/HelloWorldLexer.java deleted file mode 100644 index 6dcabd4..0000000 --- a/src/main/java/org/lumijiez/parser/HelloWorldLexer.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.lumijiez.parser;// Generated from D:/Source/JavaProjects/dsl-formal-requirements/src/grammars/HelloWorld.g4 by ANTLR 4.13.1 -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) -public class HelloWorldLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - T__0=1; - public static String[] channelNames = { - "DEFAULT_TOKEN_CHANNEL", "HIDDEN" - }; - - public static String[] modeNames = { - "DEFAULT_MODE" - }; - - private static String[] makeRuleNames() { - return new String[] { - "T__0" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, "'Hello, World!'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = "