Commit 2fb0d5b0 authored by Kateřina Sloupová's avatar Kateřina Sloupová
Browse files

add support for any value in quotation marks and tweak any values in comments

parent aa6c3784
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -346,7 +346,7 @@ def main():
    grammar_test("S'->a|aA''|\e;A''->a|bS'|<ab_0>''")
    grammar_test("S->a;\nS->aA;\nS->\e;\nA->a;\nA->bS;\n")

    words = dfa_eq("init=1 (1, a)=2 (2,a)=2  (1,b)=3 final={2,3} $comment#",
    words = dfa_eq("init=1 (1, a)=2 (2,a)=2  (1,b)=3 final={2,3} #c",
           "init=A (A, a)=B (A,b)=C (C,b)=C final={B,C}")
    print(words.right_counterexample, words.left_counterexample, words.inf)
    print()
+5 −3
Original line number Diff line number Diff line
@@ -115,7 +115,8 @@ class WebChecker:
                                 task=self.task, student_string=self.student_string)

        except ParsingError as ex:
            raise ParsingError(ex.args)
            return ex.args
            #raise ParsingError(ex.args)


    def convert(self, student_type):
@@ -143,7 +144,8 @@ class WebChecker:
                return parser.reggrammar_to_str(nfa.nfa_to_reggrammar().eliminate_useless())

        except ParsingError as ex:
            raise ParsingError(ex.args)
            return ex.args
            # raise ParsingError(ex.args)

        except Exception as ex:
            print("Error inside of web checker:", ex.args)
+5 −2
Original line number Diff line number Diff line
@@ -8,7 +8,9 @@ onerule: nonterminal ARROW (rewrite DELIMITER)* rewrite;

rewrite:         (term_or_nonterm+ | EPSILON);

term_or_nonterm: (TERMINAL | nonterminal);
term_or_nonterm: (terminal | nonterminal);

terminal:        (TERMINAL | QUOTE anyvalue+ QUOTE);

nonterminal:     (CAPS | (LEFT_ANGLE symbol+ RIGHT_ANGLE (APOSTROPHE*)) | (symbol APOSTROPHE+));

@@ -16,7 +18,7 @@ symbol: (TERMINAL | CAPS | UNDERSCORE);

comment:         (HASH anyvalue* | );

anyvalue:        LEFT_ANGLE | RIGHT_ANGLE | APOSTROPHE | UNDERSCORE | TERMINAL | CAPS | ARROW | EPSILON | DELIMITER | NEWLINE| ANYCHAR;
anyvalue:        LEFT_ANGLE | RIGHT_ANGLE | APOSTROPHE | UNDERSCORE | TERMINAL | CAPS | ARROW | EPSILON | DELIMITER | NEWLINE| ANYCHAR | HASH;

/* Lexer Rules */

@@ -33,6 +35,7 @@ EPSILON : ('ε' | '\\''e');
DELIMITER   : '|';
NEWLINE     : ('\n' | ';' | ',');
HASH        : '#';
QUOTE       : '"';

/* Characters to be ignored */
WS : [ \r\t]+ -> skip ;
+30 −28
Original line number Diff line number Diff line
@@ -8,30 +8,31 @@ import sys

def serializedATN():
    with StringIO() as buf:
        buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\17")
        buf.write("B\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7")
        buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\20")
        buf.write("F\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7")
        buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16")
        buf.write("\t\16\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7")
        buf.write("\3\b\3\b\3\b\5\b-\n\b\3\t\3\t\3\t\5\t\62\n\t\3\n\3\n\3")
        buf.write("\13\3\13\3\f\3\f\3\r\6\r;\n\r\r\r\16\r<\3\r\3\r\3\16\3")
        buf.write("\16\2\2\17\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25")
        buf.write("\f\27\r\31\16\33\17\3\2\6\4\2\62;c|\3\2C\\\5\2\f\f..=")
        buf.write("=\5\2\13\13\17\17\"\"\2D\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3")
        buf.write("\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2")
        buf.write("\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2")
        buf.write("\2\31\3\2\2\2\2\33\3\2\2\2\3\35\3\2\2\2\5\37\3\2\2\2\7")
        buf.write("!\3\2\2\2\t#\3\2\2\2\13%\3\2\2\2\r\'\3\2\2\2\17,\3\2\2")
        buf.write("\2\21\61\3\2\2\2\23\63\3\2\2\2\25\65\3\2\2\2\27\67\3\2")
        buf.write("\2\2\31:\3\2\2\2\33@\3\2\2\2\35\36\7>\2\2\36\4\3\2\2\2")
        buf.write("\37 \7@\2\2 \6\3\2\2\2!\"\7)\2\2\"\b\3\2\2\2#$\7a\2\2")
        buf.write("$\n\3\2\2\2%&\t\2\2\2&\f\3\2\2\2\'(\t\3\2\2(\16\3\2\2")
        buf.write("\2)-\7\u2194\2\2*+\7/\2\2+-\7@\2\2,)\3\2\2\2,*\3\2\2\2")
        buf.write("-\20\3\2\2\2.\62\7\u03b7\2\2/\60\7^\2\2\60\62\7g\2\2\61")
        buf.write(".\3\2\2\2\61/\3\2\2\2\62\22\3\2\2\2\63\64\7~\2\2\64\24")
        buf.write("\3\2\2\2\65\66\t\4\2\2\66\26\3\2\2\2\678\7%\2\28\30\3")
        buf.write("\2\2\29;\t\5\2\2:9\3\2\2\2;<\3\2\2\2<:\3\2\2\2<=\3\2\2")
        buf.write("\2=>\3\2\2\2>?\b\r\2\2?\32\3\2\2\2@A\13\2\2\2A\34\3\2")
        buf.write("\2\2\6\2,\61<\3\b\2\2")
        buf.write("\t\16\4\17\t\17\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3")
        buf.write("\6\3\7\3\7\3\b\3\b\3\b\5\b/\n\b\3\t\3\t\3\t\5\t\64\n\t")
        buf.write("\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\6\16?\n\16\r\16")
        buf.write("\16\16@\3\16\3\16\3\17\3\17\2\2\20\3\3\5\4\7\5\t\6\13")
        buf.write("\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\3\2")
        buf.write("\6\4\2\62;c|\3\2C\\\5\2\f\f..==\5\2\13\13\17\17\"\"\2")
        buf.write("H\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13")
        buf.write("\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3")
        buf.write("\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2")
        buf.write("\2\2\2\35\3\2\2\2\3\37\3\2\2\2\5!\3\2\2\2\7#\3\2\2\2\t")
        buf.write("%\3\2\2\2\13\'\3\2\2\2\r)\3\2\2\2\17.\3\2\2\2\21\63\3")
        buf.write("\2\2\2\23\65\3\2\2\2\25\67\3\2\2\2\279\3\2\2\2\31;\3\2")
        buf.write("\2\2\33>\3\2\2\2\35D\3\2\2\2\37 \7>\2\2 \4\3\2\2\2!\"")
        buf.write("\7@\2\2\"\6\3\2\2\2#$\7)\2\2$\b\3\2\2\2%&\7a\2\2&\n\3")
        buf.write("\2\2\2\'(\t\2\2\2(\f\3\2\2\2)*\t\3\2\2*\16\3\2\2\2+/\7")
        buf.write("\u2194\2\2,-\7/\2\2-/\7@\2\2.+\3\2\2\2.,\3\2\2\2/\20\3")
        buf.write("\2\2\2\60\64\7\u03b7\2\2\61\62\7^\2\2\62\64\7g\2\2\63")
        buf.write("\60\3\2\2\2\63\61\3\2\2\2\64\22\3\2\2\2\65\66\7~\2\2\66")
        buf.write("\24\3\2\2\2\678\t\4\2\28\26\3\2\2\29:\7%\2\2:\30\3\2\2")
        buf.write("\2;<\7$\2\2<\32\3\2\2\2=?\t\5\2\2>=\3\2\2\2?@\3\2\2\2")
        buf.write("@>\3\2\2\2@A\3\2\2\2AB\3\2\2\2BC\b\16\2\2C\34\3\2\2\2")
        buf.write("DE\13\2\2\2E\36\3\2\2\2\6\2.\63@\3\b\2\2")
        return buf.getvalue()


@@ -52,24 +53,25 @@ class CFGLexer(Lexer):
    DELIMITER = 9
    NEWLINE = 10
    HASH = 11
    WS = 12
    ANYCHAR = 13
    QUOTE = 12
    WS = 13
    ANYCHAR = 14

    channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ]

    modeNames = [ "DEFAULT_MODE" ]

    literalNames = [ "<INVALID>",
            "'<'", "'>'", "'''", "'_'", "'|'", "'#'" ]
            "'<'", "'>'", "'''", "'_'", "'|'", "'#'", "'\"'" ]

    symbolicNames = [ "<INVALID>",
            "LEFT_ANGLE", "RIGHT_ANGLE", "APOSTROPHE", "UNDERSCORE", "TERMINAL", 
            "CAPS", "ARROW", "EPSILON", "DELIMITER", "NEWLINE", "HASH", 
            "WS", "ANYCHAR" ]
            "QUOTE", "WS", "ANYCHAR" ]

    ruleNames = [ "LEFT_ANGLE", "RIGHT_ANGLE", "APOSTROPHE", "UNDERSCORE", 
                  "TERMINAL", "CAPS", "ARROW", "EPSILON", "DELIMITER", "NEWLINE", 
                  "HASH", "WS", "ANYCHAR" ]
                  "HASH", "QUOTE", "WS", "ANYCHAR" ]

    grammarFileName = "CFG.g4"

+9 −0
Original line number Diff line number Diff line
@@ -44,6 +44,15 @@ class CFGListener(ParseTreeListener):
        pass


    # Enter a parse tree produced by CFGParser#terminal.
    def enterTerminal(self, ctx:CFGParser.TerminalContext):
        pass

    # Exit a parse tree produced by CFGParser#terminal.
    def exitTerminal(self, ctx:CFGParser.TerminalContext):
        pass


    # Enter a parse tree produced by CFGParser#nonterminal.
    def enterNonterminal(self, ctx:CFGParser.NonterminalContext):
        pass
Loading