Add more samples, simplify grammar, add groups
This commit is contained in:
39
.vscode/launch.json
vendored
39
.vscode/launch.json
vendored
@@ -7,17 +7,44 @@
|
||||
{
|
||||
"type": "antlr-debug",
|
||||
"request": "launch",
|
||||
"name": "Debug Current Grammar",
|
||||
"input": "sample.bfe",
|
||||
"name": "Grammar - simple.bfe",
|
||||
"input": "samples/simple.bfe",
|
||||
"visualParseTree": true,
|
||||
"grammar": "${file}"
|
||||
"grammar": "${workspaceFolder}/grammar/bf.g4"
|
||||
},
|
||||
{
|
||||
"name": "(gdb) Launch",
|
||||
"type": "antlr-debug",
|
||||
"request": "launch",
|
||||
"name": "Grammar - group.bfe",
|
||||
"input": "samples/group.bfe",
|
||||
"visualParseTree": true,
|
||||
"grammar": "${workspaceFolder}/grammar/bf.g4"
|
||||
},
|
||||
{
|
||||
"name": "GDB - simple.bfe",
|
||||
"type": "cppdbg",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/debug/main.out",
|
||||
"args": ["sample.txt"],
|
||||
"program": "${workspaceFolder}/build/main.out",
|
||||
"args": ["samples/simple.bfe"],
|
||||
"stopAtEntry": false,
|
||||
"cwd": "${workspaceFolder}",
|
||||
"environment": [],
|
||||
"externalConsole": false,
|
||||
"MIMode": "gdb",
|
||||
"setupCommands": [
|
||||
{
|
||||
"description": "Enable pretty-printing for gdb",
|
||||
"text": "-enable-pretty-printing",
|
||||
"ignoreFailures": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "GDB - group.bfe",
|
||||
"type": "cppdbg",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/build/main.out",
|
||||
"args": ["samples/group.bfe"],
|
||||
"stopAtEntry": false,
|
||||
"cwd": "${workspaceFolder}",
|
||||
"environment": [],
|
||||
|
@@ -1,28 +1,62 @@
|
||||
grammar bf;
|
||||
|
||||
program
|
||||
: statements* EOF;
|
||||
: statements? EOF;
|
||||
|
||||
statements
|
||||
: (statement|numberedStatement|loopStmt)+;
|
||||
: eligibleStmt+;
|
||||
|
||||
eligibleStmt
|
||||
: stmt
|
||||
| numberedStmt
|
||||
;
|
||||
|
||||
numberedStmt
|
||||
: stmt NUMBER
|
||||
;
|
||||
|
||||
|
||||
stmt
|
||||
: basicStmt
|
||||
| groupedStmt
|
||||
| loopStmt
|
||||
;
|
||||
|
||||
|
||||
groupedStmt
|
||||
: GRPSTART statements GRPEND
|
||||
;
|
||||
|
||||
loopStmt
|
||||
: LOOPSTART statements LOOPEND
|
||||
;
|
||||
|
||||
numberedStatement
|
||||
: statement NUMBER
|
||||
;
|
||||
|
||||
statement
|
||||
: INC
|
||||
| DEC
|
||||
| LEFT
|
||||
| RIGHT
|
||||
basicStmt
|
||||
: ptrIncr
|
||||
| ptrDecr
|
||||
| ptrLeft
|
||||
| ptrRight
|
||||
| inputStmt
|
||||
| outputStmt
|
||||
;
|
||||
|
||||
|
||||
ptrIncr
|
||||
: INC
|
||||
;
|
||||
|
||||
ptrDecr
|
||||
: DEC
|
||||
;
|
||||
|
||||
ptrLeft
|
||||
: LEFT
|
||||
;
|
||||
|
||||
ptrRight
|
||||
: RIGHT
|
||||
;
|
||||
|
||||
inputStmt
|
||||
: INPUT
|
||||
;
|
||||
@@ -34,8 +68,11 @@ outputStmt
|
||||
NEWLINE: '\n' -> skip;
|
||||
COMMENT: '//' ~[\r\n]* '\r'? '\n'? -> channel(HIDDEN);
|
||||
WS: [ \r\n] -> skip;
|
||||
DEF: '#';
|
||||
LOOPSTART: '[';
|
||||
LOOPEND:']';
|
||||
GRPSTART:'(';
|
||||
GRPEND:')';
|
||||
NUMBER: [0-9]+;
|
||||
INPUT: '?';
|
||||
OUTPUT: '.';
|
||||
|
@@ -1,3 +1,23 @@
|
||||
#pragma once
|
||||
|
||||
#define FOO 1
|
||||
#include<string>
|
||||
#include "bfBaseListener.h"
|
||||
|
||||
|
||||
class expressionPrintingListener : public bfBaseListener {
|
||||
protected:
|
||||
std::vector<std::string> printStack;
|
||||
public:
|
||||
void enterProgram(bfParser::ProgramContext *ctx) override;
|
||||
void exitProgram(bfParser::ProgramContext *ctx) override ;
|
||||
void enterPtrIncr(bfParser::PtrIncrContext *ctx) override;
|
||||
void enterPtrDecr(bfParser::PtrDecrContext *ctx) override;
|
||||
void enterPtrLeft(bfParser::PtrLeftContext *ctx) override;
|
||||
void enterPtrRight(bfParser::PtrRightContext *ctx) override;
|
||||
void enterNumberedStmt(bfParser::NumberedStmtContext *ctx) override;
|
||||
void exitNumberedStmt(bfParser::NumberedStmtContext *ctx) override;
|
||||
void enterLoopStmt(bfParser::LoopStmtContext *ctx) override;
|
||||
void exitLoopStmt(bfParser::LoopStmtContext *ctx) override;
|
||||
void enterGroupedStmt(bfParser::GroupedStmtContext *ctx) override;
|
||||
void exitGroupedStmt(bfParser::GroupedStmtContext *ctx) override;
|
||||
};
|
2
samples/group.bfe
Normal file
2
samples/group.bfe
Normal file
@@ -0,0 +1,2 @@
|
||||
//should print ++++++
|
||||
(+2)3
|
@@ -2,4 +2,5 @@
|
||||
|
||||
-[-7>+<]>-.-[->+5<]>++.+7..+3.[-3>+<]>-5.--[->+4<]>-.-8.+3.-6.-8.
|
||||
|
||||
|
||||
// courtesy of https://copy.sh/brainfuck/text.html
|
70
src/main.cpp
70
src/main.cpp
@@ -1,4 +1,6 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <antlr4-common.h>
|
||||
#include "main.hpp"
|
||||
#include "bfLexer.h"
|
||||
@@ -8,43 +10,69 @@
|
||||
|
||||
using namespace antlr4;
|
||||
|
||||
class expressionPrintingListener : public bfBaseListener
|
||||
void expressionPrintingListener::enterProgram(bfParser::ProgramContext *ctx)
|
||||
{
|
||||
public:
|
||||
void enterStatement(bfParser::StatementContext *ctx) override
|
||||
printStack.push_back("");
|
||||
}
|
||||
void expressionPrintingListener::exitProgram(bfParser::ProgramContext *ctx)
|
||||
{
|
||||
std::cout << ctx->getText();
|
||||
std::cout << printStack.front() << std::endl;
|
||||
}
|
||||
void enterNumberedStatement(bfParser::NumberedStatementContext *ctx) override
|
||||
void expressionPrintingListener::enterPtrIncr(bfParser::PtrIncrContext *ctx)
|
||||
{
|
||||
int num = 0;
|
||||
try{
|
||||
num = stoi(ctx->NUMBER()->getText());
|
||||
}catch(std::exception e){
|
||||
num = 1;
|
||||
printStack.back() += "+";
|
||||
}
|
||||
for (int i = 0; i < num - 1; i++)
|
||||
void expressionPrintingListener::enterPtrDecr(bfParser::PtrDecrContext *ctx)
|
||||
{
|
||||
std::cout << ctx->statement()->getText();
|
||||
printStack.back() += ("-");
|
||||
}
|
||||
void expressionPrintingListener::enterPtrLeft(bfParser::PtrLeftContext *ctx)
|
||||
{
|
||||
printStack.back() += ("<");
|
||||
}
|
||||
void expressionPrintingListener::enterPtrRight(bfParser::PtrRightContext *ctx)
|
||||
{
|
||||
printStack.back() += (">");
|
||||
}
|
||||
|
||||
void expressionPrintingListener::enterNumberedStmt(bfParser::NumberedStmtContext *ctx)
|
||||
{
|
||||
printStack.push_back("");
|
||||
}
|
||||
void expressionPrintingListener::exitNumberedStmt(bfParser::NumberedStmtContext *ctx)
|
||||
{
|
||||
std::string s = printStack.back();
|
||||
printStack.pop_back();
|
||||
int n = stoi(ctx->NUMBER()->getText());
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
printStack.back() += s;
|
||||
}
|
||||
}
|
||||
void exitProgram(bfParser::ProgramContext *ctx) override{
|
||||
std::cout<<std::endl;
|
||||
void expressionPrintingListener::enterLoopStmt(bfParser::LoopStmtContext *ctx){
|
||||
printStack.push_back("");
|
||||
}
|
||||
void enterLoopStmt(bfParser::LoopStmtContext *ctx) override{
|
||||
std::cout<<'[';
|
||||
void expressionPrintingListener::exitLoopStmt(bfParser::LoopStmtContext *ctx){
|
||||
std::string s = printStack.back();
|
||||
printStack.pop_back();
|
||||
printStack.back()+= "["+s+"]";
|
||||
}
|
||||
void exitLoopStmt(bfParser::LoopStmtContext *ctx) override{
|
||||
std::cout<<']';
|
||||
void expressionPrintingListener::enterGroupedStmt(bfParser::GroupedStmtContext *ctx){
|
||||
printStack.push_back("");
|
||||
}
|
||||
void expressionPrintingListener::exitGroupedStmt(bfParser::GroupedStmtContext *ctx){
|
||||
std::string s = printStack.back();
|
||||
printStack.pop_back();
|
||||
printStack.back()+=(s);
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, const char *argv[])
|
||||
{
|
||||
std::ifstream stream;
|
||||
|
||||
bool outFile = false;
|
||||
stream.open(argv[1]);
|
||||
if(stream.fail()){
|
||||
if (stream.fail())
|
||||
{
|
||||
std::cout << "Could not open" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user