l2
This commit is contained in:
parent
ef0b5011ce
commit
90c7998470
8 changed files with 330 additions and 39 deletions
16
flake.lock
16
flake.lock
|
@ -1,20 +1,5 @@
|
||||||
{
|
{
|
||||||
"nodes": {
|
"nodes": {
|
||||||
"crane": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1729273024,
|
|
||||||
"narHash": "sha256-Mb5SemVsootkn4Q2IiY0rr9vrXdCCpQ9HnZeD/J3uXs=",
|
|
||||||
"owner": "ipetkov",
|
|
||||||
"repo": "crane",
|
|
||||||
"rev": "fa8b7445ddadc37850ed222718ca86622be01967",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "ipetkov",
|
|
||||||
"repo": "crane",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"fenix": {
|
"fenix": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
|
@ -54,7 +39,6 @@
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"crane": "crane",
|
|
||||||
"fenix": "fenix",
|
"fenix": "fenix",
|
||||||
"nixpkgs": "nixpkgs",
|
"nixpkgs": "nixpkgs",
|
||||||
"systems": "systems"
|
"systems": "systems"
|
||||||
|
|
25
flake.nix
25
flake.nix
|
@ -4,7 +4,6 @@
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||||
systems.url = "github:nix-systems/default";
|
systems.url = "github:nix-systems/default";
|
||||||
crane.url = "github:ipetkov/crane";
|
|
||||||
fenix = {
|
fenix = {
|
||||||
url = "github:nix-community/fenix";
|
url = "github:nix-community/fenix";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
@ -12,31 +11,12 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = { self, nixpkgs, systems, crane, fenix, ... }: let
|
outputs = { nixpkgs, systems, fenix, ... }: let
|
||||||
name = "jftt";
|
name = "jftt";
|
||||||
|
|
||||||
forEachSystem = nixpkgs.lib.genAttrs (import systems);
|
forEachSystem = nixpkgs.lib.genAttrs (import systems);
|
||||||
pkgsForEach = nixpkgs.legacyPackages;
|
pkgsForEach = nixpkgs.legacyPackages;
|
||||||
in {
|
in {
|
||||||
# packages = forEachSystem (
|
|
||||||
# system: let
|
|
||||||
# pkgs = pkgsForEach.${system};
|
|
||||||
# craneLib = (crane.mkLib pkgs).overrideToolchain (
|
|
||||||
# fenix.packages.${system}.complete.withComponents [
|
|
||||||
# "cargo"
|
|
||||||
# "rustc"
|
|
||||||
# "rust-src"
|
|
||||||
# ]
|
|
||||||
# );
|
|
||||||
# in {
|
|
||||||
# default = craneLib.buildPackage {
|
|
||||||
# pname = name;
|
|
||||||
# version = "0.1.0";
|
|
||||||
# src = craneLib.cleanCargoSource ./.;
|
|
||||||
# };
|
|
||||||
# }
|
|
||||||
# );
|
|
||||||
|
|
||||||
devShells = forEachSystem (
|
devShells = forEachSystem (
|
||||||
system: let
|
system: let
|
||||||
pkgs = pkgsForEach.${system};
|
pkgs = pkgsForEach.${system};
|
||||||
|
@ -51,9 +31,8 @@
|
||||||
"rustc"
|
"rustc"
|
||||||
"rust-src"
|
"rust-src"
|
||||||
])
|
])
|
||||||
|
flex
|
||||||
];
|
];
|
||||||
|
|
||||||
# inputsFrom = [ self.packages.${system}.default ];
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
1
l2/.gitignore
vendored
Normal file
1
l2/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
target/
|
29
l2/1.l
Normal file
29
l2/1.l
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
%{
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
uint32_t line_count = 0;
|
||||||
|
uint32_t word_count = 0;
|
||||||
|
%}
|
||||||
|
|
||||||
|
%%
|
||||||
|
^[[:blank:]]*\n
|
||||||
|
[[:blank:]]+$
|
||||||
|
^[[:blank:]]+
|
||||||
|
[[:blank:]]+ { putchar(' '); }
|
||||||
|
\n { line_count += 1; ECHO; }
|
||||||
|
[[:^space:]]+ { word_count += 1; ECHO; }
|
||||||
|
. { ECHO; }
|
||||||
|
%%
|
||||||
|
|
||||||
|
// https://westes.github.io/flex/manual/Patterns.html
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
yylex();
|
||||||
|
|
||||||
|
printf("%d %d\n", line_count, word_count);
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
20
l2/2.l
Normal file
20
l2/2.l
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
%x COMMENT
|
||||||
|
|
||||||
|
%%
|
||||||
|
<INITIAL>"--" { BEGIN(COMMENT); }
|
||||||
|
<COMMENT>"\n" { ECHO; BEGIN(INITIAL); }
|
||||||
|
|
||||||
|
<INITIAL>. { ECHO; }
|
||||||
|
<COMMENT>. { }
|
||||||
|
%%
|
||||||
|
|
||||||
|
// https://westes.github.io/flex/manual/Start-Conditions.html
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
yylex();
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
65
l2/3.l
Normal file
65
l2/3.l
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
%{
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
bool leave_docs = false;
|
||||||
|
%}
|
||||||
|
|
||||||
|
%x SINGLE_LINE
|
||||||
|
%x MULTI_LINE
|
||||||
|
|
||||||
|
%%
|
||||||
|
<INITIAL>"///"|"//!" {
|
||||||
|
if (leave_docs) {
|
||||||
|
ECHO;
|
||||||
|
} else {
|
||||||
|
BEGIN(SINGLE_LINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<INITIAL>"/**"|"/*!" {
|
||||||
|
if (leave_docs) {
|
||||||
|
ECHO;
|
||||||
|
} else {
|
||||||
|
BEGIN(MULTI_LINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<INITIAL>"//" { BEGIN(SINGLE_LINE); }
|
||||||
|
<INITIAL>. { ECHO; }
|
||||||
|
<SINGLE_LINE>\n { BEGIN(INITIAL); }
|
||||||
|
<SINGLE_LINE>. { }
|
||||||
|
|
||||||
|
<INITIAL>"/*" { BEGIN(MULTI_LINE); }
|
||||||
|
<MULTI_LINE>"*/" { BEGIN(INITIAL); }
|
||||||
|
<MULTI_LINE>. { }
|
||||||
|
%%
|
||||||
|
|
||||||
|
// single line comment
|
||||||
|
|
||||||
|
/*
|
||||||
|
* multi line comment
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// single line doc 1
|
||||||
|
|
||||||
|
//! single line doc 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* multi line doc 1
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* multi line doc 2
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
if (argc > 1) {
|
||||||
|
leave_docs = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
yylex();
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
197
l2/4.l
Normal file
197
l2/4.l
Normal file
|
@ -0,0 +1,197 @@
|
||||||
|
%{
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int64_t value;
|
||||||
|
bool exists;
|
||||||
|
} Option;
|
||||||
|
|
||||||
|
uint64_t allocated = 0;
|
||||||
|
int64_t *bottom;
|
||||||
|
int64_t *top;
|
||||||
|
|
||||||
|
void reset(void) {
|
||||||
|
top = bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
void push(int64_t x) {
|
||||||
|
if (top >= bottom + allocated) {
|
||||||
|
errno = 0;
|
||||||
|
bottom = realloc(bottom, allocated * 2);
|
||||||
|
|
||||||
|
if (errno == ENOMEM) {
|
||||||
|
fprintf(stderr, "failed reallocating stack!\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*top = x;
|
||||||
|
top += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Option pop(void) {
|
||||||
|
if (top == bottom) {
|
||||||
|
printf("Błąd: za mała liczba argumentów\n");
|
||||||
|
|
||||||
|
reset();
|
||||||
|
|
||||||
|
return (Option){
|
||||||
|
.value = 0,
|
||||||
|
.exists = false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
top -= 1;
|
||||||
|
return (Option){
|
||||||
|
.value = *top,
|
||||||
|
.exists = true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
%x ERROR
|
||||||
|
|
||||||
|
%%
|
||||||
|
<INITIAL>{
|
||||||
|
-?[[:digit:]]+ {
|
||||||
|
errno = 0;
|
||||||
|
int64_t x = strtoll(yytext, NULL, 10);
|
||||||
|
|
||||||
|
if (errno == ERANGE) {
|
||||||
|
if (x == LLONG_MIN) {
|
||||||
|
printf("Błąd: zbyt mała liczba\n");
|
||||||
|
} else if (x == LLONG_MAX) {
|
||||||
|
printf("Błąd: zbyt duża liczba\n");
|
||||||
|
}
|
||||||
|
reset();
|
||||||
|
} else {
|
||||||
|
push(x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"+" {
|
||||||
|
Option x = pop();
|
||||||
|
Option y = pop();
|
||||||
|
|
||||||
|
if (!x.exists || !y.exists) {
|
||||||
|
reset();
|
||||||
|
BEGIN(ERROR);
|
||||||
|
} else {
|
||||||
|
push(y.value + x.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"-" {
|
||||||
|
Option x = pop();
|
||||||
|
Option y = pop();
|
||||||
|
|
||||||
|
if (!x.exists || !y.exists) {
|
||||||
|
reset();
|
||||||
|
BEGIN(ERROR);
|
||||||
|
} else {
|
||||||
|
push(y.value - x.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"*" {
|
||||||
|
Option x = pop();
|
||||||
|
Option y = pop();
|
||||||
|
|
||||||
|
if (!x.exists || !y.exists) {
|
||||||
|
reset();
|
||||||
|
BEGIN(ERROR);
|
||||||
|
} else {
|
||||||
|
push(y.value * x.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"/" {
|
||||||
|
Option x = pop();
|
||||||
|
Option y = pop();
|
||||||
|
|
||||||
|
if (!x.exists || !y.exists) {
|
||||||
|
reset();
|
||||||
|
BEGIN(ERROR);
|
||||||
|
} else {
|
||||||
|
push(y.value / x.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"%" {
|
||||||
|
Option x = pop();
|
||||||
|
Option y = pop();
|
||||||
|
|
||||||
|
if (!x.exists || !y.exists) {
|
||||||
|
reset();
|
||||||
|
BEGIN(ERROR);
|
||||||
|
} else {
|
||||||
|
push(y.value % x.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"^" {
|
||||||
|
Option x = pop();
|
||||||
|
Option y = pop();
|
||||||
|
|
||||||
|
if (!x.exists || !y.exists) {
|
||||||
|
reset();
|
||||||
|
BEGIN(ERROR);
|
||||||
|
} else {
|
||||||
|
push((int64_t)powl((long double)y.value, (long double)x.value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
\n {
|
||||||
|
if (top > bottom + 1) {
|
||||||
|
printf("Błąd: za mała liczba operatorów\n");
|
||||||
|
|
||||||
|
reset();
|
||||||
|
} else {
|
||||||
|
Option x = pop();
|
||||||
|
|
||||||
|
if (!x.exists) {
|
||||||
|
reset();
|
||||||
|
BEGIN(ERROR);
|
||||||
|
} else {
|
||||||
|
printf("= %" PRId64 "\n", x.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[[:blank:]]+ {}
|
||||||
|
|
||||||
|
. {
|
||||||
|
printf("Błąd: zły symbol \"%s\"\n", yytext);
|
||||||
|
reset();
|
||||||
|
BEGIN(ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<ERROR>{
|
||||||
|
\n { BEGIN(INITIAL); }
|
||||||
|
. { }
|
||||||
|
}
|
||||||
|
%%
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
allocated = 8;
|
||||||
|
bottom = (int64_t *)malloc(allocated * sizeof(int64_t));
|
||||||
|
|
||||||
|
if (bottom == NULL) {
|
||||||
|
fprintf(stderr, "failed allocating stack!\n");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
top = bottom;
|
||||||
|
|
||||||
|
yylex();
|
||||||
|
|
||||||
|
free(bottom);
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
16
l2/Makefile
Normal file
16
l2/Makefile
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
FLEX = flex
|
||||||
|
CC = gcc
|
||||||
|
|
||||||
|
BIN = target
|
||||||
|
|
||||||
|
all: dirs 1 2 3 4
|
||||||
|
|
||||||
|
dirs:
|
||||||
|
mkdir -p $(BIN)
|
||||||
|
|
||||||
|
%: %.l
|
||||||
|
$(FLEX) -o $(BIN)/$@.lex.yy.c $<
|
||||||
|
$(CC) $(BIN)/$@.lex.yy.c -lfl -lm -o $(BIN)/$@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rfv $(BIN)
|
Loading…
Reference in a new issue