def main():
    tokenizer_graphviz = fsm_to_graphviz(Tokenizer.TRANSITION_TABLE)
    with open('tokenizer.gv', 'w') as f:
        f.write(tokenizer_graphviz)

    recognizer = SyntaxRecognizer()
    recognizer.open_handler([''])
    recognizer_graphviz = fsm_to_graphviz(recognizer.fsm.states)
    with open('recognizer.gv', 'w') as f:
        f.write(recognizer_graphviz)

    recognizer_graphviz = fsm_to_graphviz(
        recognizer.fsm.states['if'].transitions[0].event.states)
    with open('exp.gv', 'w') as f:
        f.write(recognizer_graphviz)
Beispiel #2
0
def create_event_engine():
    return EventEngine([
        FileReader(),
        AsciiCategorizer(),
        Tokenizer(),
        SyntaxRecognizer(),
    ])
def to_ir(filename):
    engine = EventEngine([
        FileReader(),
        AsciiCategorizer(),
        Tokenizer(),
        SyntaxRecognizer(),
    ])
    engine.start(('open', filename))
Beispiel #4
0
def test_empty_program():
    syntax_recognizer = SyntaxRecognizer(None)
    with io.StringIO() as f:
        with redirect_stdout(f):
            syntax_recognizer.handle_event(('open', 'source.bas'))
            syntax_recognizer.handle_event(('eof', None))
        s = f.getvalue()
    assert_source_matches(s, '''source_filename = "source.bas"
target triple = "x86_64-pc-linux-gnu"
; void @program(i8* %target_label) omitted because it's empty
define dso_local i32 @main() local_unnamed_addr #1 {
  ret i32 0
}
''')
Beispiel #5
0
def test_duplicate_label():
    syntax_recognizer = SyntaxRecognizer(None)
    syntax_recognizer.handle_event(('open', 'source.bas'))
    syntax_recognizer.handle_event(('number', '100'))
    syntax_recognizer.handle_event(('identifier', 'print'))
    syntax_recognizer.handle_event(('identifier', 'FNX'))
    syntax_recognizer.handle_event(('special', '('))
    syntax_recognizer.handle_event(('variable', 'x'))
    syntax_recognizer.handle_event(('special', ')'))
    syntax_recognizer.handle_event(('end_of_line', '\n'))
    syntax_recognizer.handle_event(('eof', None))
Beispiel #6
0
def test_duplicate_label():
    syntax_recognizer = SyntaxRecognizer(None)
    syntax_recognizer.handle_event(('open', 'source.bas'))
    syntax_recognizer.handle_event(('number', '100'))
    syntax_recognizer.handle_event(('identifier', 'return'))
    syntax_recognizer.handle_event(('end_of_line', '\n'))
    syntax_recognizer.handle_event(('number', '100'))
    syntax_recognizer.handle_event(('identifier', 'return'))
    syntax_recognizer.handle_event(('end_of_line', '\n'))
    syntax_recognizer.handle_event(('eof', None))
Beispiel #7
0
def test_undefined_label_at_gosub():
    syntax_recognizer = SyntaxRecognizer(None)
    syntax_recognizer.handle_event(('open', 'source.bas'))
    syntax_recognizer.handle_event(('number', '100'))
    syntax_recognizer.handle_event(('identifier', 'gosub'))
    syntax_recognizer.handle_event(('number', '200'))
    syntax_recognizer.handle_event(('end_of_line', '\n'))
    syntax_recognizer.handle_event(('eof', None))
Beispiel #8
0
def test_minimal_program():
    syntax_recognizer = SyntaxRecognizer(None)
    with io.StringIO() as f:
        with redirect_stdout(f):
            syntax_recognizer.handle_event(('open', 'source.bas'))
            syntax_recognizer.handle_event(('number', '100'))
            syntax_recognizer.handle_event(('identifier', 'return'))
            syntax_recognizer.handle_event(('end_of_line', '\n'))
            syntax_recognizer.handle_event(('eof', None))
        s = f.getvalue()
    assert_source_matches(s,  '''source_filename = "source.bas"
target triple = "x86_64-pc-linux-gnu"
define dso_local void @program(i8* %target_label) local_unnamed_addr #0 {
  indirectbr i8* %target_label, [ label %label_100 ]
label_100:
  ret void
}
define dso_local i32 @main() local_unnamed_addr #1 {
  tail call void @program(i8* blockaddress(@program, %label_100)) #0
  ret i32 0
}
''')
Beispiel #9
0
def test_data():
    syntax_recognizer = SyntaxRecognizer(None)
    with io.StringIO() as f:
        with redirect_stdout(f):
            syntax_recognizer.handle_event(('open', 'source.bas'))
            syntax_recognizer.handle_event(('number', '100'))
            syntax_recognizer.handle_event(('identifier', 'data'))
            syntax_recognizer.handle_event(('number', '10'))
            syntax_recognizer.handle_event(('special', ','))
            syntax_recognizer.handle_event(('special', '-'))
            syntax_recognizer.handle_event(('number', '20'))
            syntax_recognizer.handle_event(('special', ','))
            syntax_recognizer.handle_event(('special', '+'))
            syntax_recognizer.handle_event(('number', '30'))
            syntax_recognizer.handle_event(('special', ','))
            syntax_recognizer.handle_event(('number', '3.14e-0'))
            syntax_recognizer.handle_event(('special', ','))
            syntax_recognizer.handle_event(('number', '-.5'))
            syntax_recognizer.handle_event(('end_of_line', '\n'))
            syntax_recognizer.handle_event(('eof', None))
        s = f.getvalue()
    assert_source_matches(s,  '''source_filename = "source.bas"
target triple = "x86_64-pc-linux-gnu"
@DATA = private unnamed_addr constant [5 x double] [double 10.0, double -20.0, double 30.0, double 3.14, double -0.5], align 16
@data_index = internal global i32 0, align 4
define dso_local void @program(i8* %target_label) local_unnamed_addr #0 {
  indirectbr i8* %target_label, [ label %label_100 ]
label_100:
  tail call void @exit(i32 0) noreturn #0
  unreachable
}
define dso_local i32 @main() local_unnamed_addr #1 {
  tail call void @program(i8* blockaddress(@program, %label_100)) #0
  ret i32 0
}
declare void @exit(i32) local_unnamed_addr noreturn #0
''')