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 Original line 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|aA''|\e;A''->a|bS'|<ab_0>''")
    grammar_test("S->a;\nS->aA;\nS->\e;\nA->a;\nA->bS;\n")
    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}")
           "init=A (A, a)=B (A,b)=C (C,b)=C final={B,C}")
    print(words.right_counterexample, words.left_counterexample, words.inf)
    print(words.right_counterexample, words.left_counterexample, words.inf)
    print()
    print()
+5 −3
Original line number Original line Diff line number Diff line
@@ -115,7 +115,8 @@ class WebChecker:
                                 task=self.task, student_string=self.student_string)
                                 task=self.task, student_string=self.student_string)


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




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


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


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


rewrite:         (term_or_nonterm+ | EPSILON);
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+));
nonterminal:     (CAPS | (LEFT_ANGLE symbol+ RIGHT_ANGLE (APOSTROPHE*)) | (symbol APOSTROPHE+));


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


comment:         (HASH anyvalue* | );
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 */
/* Lexer Rules */


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


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


def serializedATN():
def serializedATN():
    with StringIO() as buf:
    with StringIO() as buf:
        buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\17")
        buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\20")
        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("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("\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("\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("\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("\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("\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("\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\2\2\17\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25")
        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("\f\27\r\31\16\33\17\3\2\6\4\2\62;c|\3\2C\\\5\2\f\f..=")
        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("=\5\2\13\13\17\17\"\"\2D\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3")
        buf.write("\6\4\2\62;c|\3\2C\\\5\2\f\f..==\5\2\13\13\17\17\"\"\2")
        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("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("\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("\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\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("\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("!\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\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("\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("%\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\31:\3\2\2\2\33@\3\2\2\2\35\36\7>\2\2\36\4\3\2\2\2")
        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("\37 \7@\2\2 \6\3\2\2\2!\"\7)\2\2\"\b\3\2\2\2#$\7a\2\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("$\n\3\2\2\2%&\t\2\2\2&\f\3\2\2\2\'(\t\3\2\2(\16\3\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)-\7\u2194\2\2*+\7/\2\2+-\7@\2\2,)\3\2\2\2,*\3\2\2\2")
        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("-\20\3\2\2\2.\62\7\u03b7\2\2/\60\7^\2\2\60\62\7g\2\2\61")
        buf.write("\u2194\2\2,-\7/\2\2-/\7@\2\2.+\3\2\2\2.,\3\2\2\2/\20\3")
        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("\2\2\2\60\64\7\u03b7\2\2\61\62\7^\2\2\62\64\7g\2\2\63")
        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("\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("\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("\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=>\3\2\2\2>?\b\r\2\2?\32\3\2\2\2@A\13\2\2\2A\34\3\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("\2\2\6\2,\61<\3\b\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()
        return buf.getvalue()




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


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


    modeNames = [ "DEFAULT_MODE" ]
    modeNames = [ "DEFAULT_MODE" ]


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


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


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


    grammarFileName = "CFG.g4"
    grammarFileName = "CFG.g4"


+9 −0
Original line number Original line Diff line number Diff line
@@ -44,6 +44,15 @@ class CFGListener(ParseTreeListener):
        pass
        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.
    # Enter a parse tree produced by CFGParser#nonterminal.
    def enterNonterminal(self, ctx:CFGParser.NonterminalContext):
    def enterNonterminal(self, ctx:CFGParser.NonterminalContext):
        pass
        pass
Loading