diff options
| Commit | 7e8bcc75b6ae00248ad4f9ff9753be251d88a4ff (patch) | |
|---|---|---|
| Author | 2022-11-03 20:51:40 +0200 | |
| Committer | 2022-11-03 20:51:40 +0200 | |
| Files | 62c25059ff0d41e13a0eac6765674fed68d604eb | |
| IPL-7e8bcc75b6ae00248ad4f9ff9753be251d88a4ff.tar IPL-7e8bcc75b6ae00248ad4f9ff9753be251d88a4ff.tar.gz IPL-7e8bcc75b6ae00248ad4f9ff9753be251d88a4ff.zip | ||
| Parent | db0818ba7ebf7bc7602ba6cbf7afe2327b94cc87 (diff) | |
solution to first homework (#132)
* Delete lex.yy.c
* adding homework1
* Delete output
* correction to the location of the folders
Co-authored-by: dtrendafilov <trendafilov.dn@gmail.com>
3 files changed, 197 insertions, 0 deletions
| -rw-r--r-- | homework/9MI0800164/Homework1_9MI0800164/lua_lex.l | 77 | ||||
| -rw-r--r-- | homework/9MI0800164/Homework1_9MI0800164/markov_chain.lua | 59 | ||||
| -rw-r--r-- | homework/9MI0800164/Homework1_9MI0800164/result.html | 61 |
diff --git a/homework/9MI0800164/Homework1_9MI0800164/lua_lex.l b/homework/9MI0800164/Homework1_9MI0800164/lua_lex.l new file mode 100644 index 0000000..e51f53c --- /dev/null +++ b/homework/9MI0800164/Homework1_9MI0800164/lua_lex.l @@ -0,0 +1,77 @@ +%{ + +%} + +DIGIT [0-9] +ID [a-zA-Z_0-9]* +KEYWORD and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while +OPERATOR "+"|"-"|"*"|"/"|"%"|"^"|"#"|"=="|"~="|"<="|">="|"<"|">"|"="|"("|")"|"{"|"}"|"["|"]"|"::"|";"|":"|","|"."|".."|"..."|"<<"|">>"|"&"|"|"|"//"|"~"|"'"|"--"|"?"|"\""|"\\n" + + +%% + +{DIGIT}+ { + printf("<span class=\"number\">%s</span>", yytext); + } +{KEYWORD} printf("<span class=\"keyword\">%s</span>", yytext); + +(".") printf("<span class=\"string\">%s</span>", yytext); + +{ID} printf("<span class=\"identifier\">%s</span>", yytext); + +(--.) printf("<span class=\"comment\">%s</span>", yytext); + +{OPERATOR} printf("<span class=\"operator\">%s</span>", yytext); + +[ \t\n]+ printf("%s", yytext); + +. printf( "Unrecognized character: %s\n", yytext ); + +%% +int yywrap() +{ + return 1; +} +int main(int argc, const char* argv[]) +{ + if ( argc > 0 ) + yyin = fopen( "markov_chain.lua", "r" ); + else + yyin = stdin; + puts( + "<!doctype>" + "<html>" + "<head>" + " <title>markov_chain.lua</title>" + " <style>" + " .keyword {" + " color: red;" + " }" + " .identifier {" + " color: purple;" + " }" + " .string {" + " color: orange;" + " }" + + " .number {" + " color: blue;" + " }" + " .string {" + " color: green;" + " }" + " .operator {" + " font-style: bold;" + " }" + " .comment {" + " color: gray;" + " }" + " </style>" + "</head>" + "<body>" + " <pre class=\"code\">" + ); + yylex(); + puts("</pre></body></html>"); + return 0; +} diff --git a/homework/9MI0800164/Homework1_9MI0800164/markov_chain.lua b/homework/9MI0800164/Homework1_9MI0800164/markov_chain.lua new file mode 100644 index 0000000..2750c97 --- /dev/null +++ b/homework/9MI0800164/Homework1_9MI0800164/markov_chain.lua @@ -0,0 +1,59 @@ +-- Markov Chain Program in Lua + +function allwords () + local line = io.read() -- current line + local pos = 1 -- current position in the line + return function () -- iterator function + while line do -- repeat while there are lines + local s, e = string.find(line, "%w+", pos) + if s then -- found a word? + pos = e + 1 -- update next position + return string.sub(line, s, e) -- return the word + else + line = io.read() -- word not found; try next line + pos = 1 -- restart from first position + end + end + return nil -- no more lines: end of traversal + end +end + +function prefix (w1, w2) + return w1 .. ' ' .. w2 +end + +local statetab + +function insert (index, value) + if not statetab[index] then + statetab[index] = {n=0} + end + table.insert(statetab[index], value) +end + +local N = 2 +local MAXGEN = 10000 +local NOWORD = "\n" + +-- build table +statetab = {} +local w1, w2 = NOWORD, NOWORD +for w in allwords() do + insert(prefix(w1, w2), w) + w1 = w2; w2 = w; +end +insert(prefix(w1, w2), NOWORD) + + +-- generate text +w1 = NOWORD; w2 = NOWORD -- reinitialize +for i=1,MAXGEN do + local list = statetab[prefix(w1, w2)] + -- choose a random item from list + local r = math.random(table.getn(list)) + local nextword = list[r] + if nextword == NOWORD then return end + io.write(nextword, " ") + w1 = w2; w2 = nextword +end + diff --git a/homework/9MI0800164/Homework1_9MI0800164/result.html b/homework/9MI0800164/Homework1_9MI0800164/result.html new file mode 100644 index 0000000..f84c673 --- /dev/null +++ b/homework/9MI0800164/Homework1_9MI0800164/result.html @@ -0,0 +1,61 @@ +<!doctype><html><head> <title>markov_chain.lua</title> <style> .keyword { color: red; } .identifier { color: purple; } .string { color: orange; } .number { color: blue; } .string { color: green; } .operator { font-style: bold; } .comment { color: gray; } </style></head><body> <pre class="code"> +<span class="comment">-- </span><span class="identifier">Markov</span> <span class="identifier">Chain</span> <span class="identifier">Program</span> <span class="keyword">in</span> <span class="identifier">Lua</span> + +<span class="keyword">function</span> <span class="identifier">allwords</span> <span class="operator">(</span><span class="operator">)</span> + <span class="keyword">local</span> <span class="identifier">line</span> <span class="operator">=</span> <span class="identifier">io</span><span class="string">.</span><span class="identifier">read</span><span class="operator">(</span><span class="operator">)</span> <span class="comment">-- </span><span class="identifier">current</span> <span class="identifier">line</span> + <span class="keyword">local</span> <span class="identifier">pos</span> <span class="operator">=</span> <span class="number">1</span> <span class="comment">-- </span><span class="identifier">current</span> <span class="identifier">position</span> <span class="keyword">in</span> <span class="identifier">the</span> <span class="identifier">line</span> + <span class="keyword">return</span> <span class="keyword">function</span> <span class="operator">(</span><span class="operator">)</span> <span class="comment">-- </span><span class="identifier">iterator</span> <span class="keyword">function</span> + <span class="keyword">while</span> <span class="identifier">line</span> <span class="keyword">do</span> <span class="comment">-- </span><span class="keyword">repeat</span> <span class="keyword">while</span> <span class="identifier">there</span> <span class="identifier">are</span> <span class="identifier">lines</span> + <span class="keyword">local</span> <span class="identifier">s</span><span class="operator">,</span> <span class="identifier">e</span> <span class="operator">=</span> <span class="identifier">string</span><span class="string">.</span><span class="identifier">find</span><span class="operator">(</span><span class="identifier">line</span><span class="operator">,</span> <span class="operator">"</span><span class="operator">%</span><span class="identifier">w</span><span class="operator">+</span><span class="operator">"</span><span class="operator">,</span> <span class="identifier">pos</span><span class="operator">)</span> + <span class="keyword">if</span> <span class="identifier">s</span> <span class="keyword">then</span> <span class="comment">-- </span><span class="identifier">found</span> <span class="identifier">a</span> <span class="identifier">word</span><span class="operator">?</span> + <span class="identifier">pos</span> <span class="operator">=</span> <span class="identifier">e</span> <span class="operator">+</span> <span class="number">1</span> <span class="comment">-- </span><span class="identifier">update</span> <span class="identifier">next</span> <span class="identifier">position</span> + <span class="keyword">return</span> <span class="identifier">string</span><span class="string">.</span><span class="identifier">sub</span><span class="operator">(</span><span class="identifier">line</span><span class="operator">,</span> <span class="identifier">s</span><span class="operator">,</span> <span class="identifier">e</span><span class="operator">)</span> <span class="comment">-- </span><span class="keyword">return</span> <span class="identifier">the</span> <span class="identifier">word</span> + <span class="keyword">else</span> + <span class="identifier">line</span> <span class="operator">=</span> <span class="identifier">io</span><span class="string">.</span><span class="identifier">read</span><span class="operator">(</span><span class="operator">)</span> <span class="comment">-- </span><span class="identifier">word</span> <span class="keyword">not</span> <span class="identifier">found</span><span class="operator">;</span> <span class="identifier">try</span> <span class="identifier">next</span> <span class="identifier">line</span> + <span class="identifier">pos</span> <span class="operator">=</span> <span class="number">1</span> <span class="comment">-- </span><span class="identifier">restart</span> <span class="identifier">from</span> <span class="identifier">first</span> <span class="identifier">position</span> + <span class="keyword">end</span> + <span class="keyword">end</span> + <span class="keyword">return</span> <span class="keyword">nil</span> <span class="comment">-- </span><span class="identifier">no</span> <span class="identifier">more</span> <span class="identifier">lines</span><span class="operator">:</span> <span class="keyword">end</span> <span class="identifier">of</span> <span class="identifier">traversal</span> + <span class="keyword">end</span> +<span class="keyword">end</span> + +<span class="keyword">function</span> <span class="identifier">prefix</span> <span class="operator">(</span><span class="identifier">w1</span><span class="operator">,</span> <span class="identifier">w2</span><span class="operator">)</span> + <span class="keyword">return</span> <span class="identifier">w1</span> <span class="operator">..</span> <span class="operator">'</span> <span class="operator">'</span> <span class="operator">..</span> <span class="identifier">w2</span> +<span class="keyword">end</span> + +<span class="keyword">local</span> <span class="identifier">statetab</span> + +<span class="keyword">function</span> <span class="identifier">insert</span> <span class="operator">(</span><span class="identifier">index</span><span class="operator">,</span> <span class="identifier">value</span><span class="operator">)</span> + <span class="keyword">if</span> <span class="keyword">not</span> <span class="identifier">statetab</span><span class="operator">[</span><span class="identifier">index</span><span class="operator">]</span> <span class="keyword">then</span> + <span class="identifier">statetab</span><span class="operator">[</span><span class="identifier">index</span><span class="operator">]</span> <span class="operator">=</span> <span class="operator">{</span><span class="identifier">n</span><span class="operator">=</span><span class="number">0</span><span class="operator">}</span> + <span class="keyword">end</span> + <span class="identifier">table</span><span class="string">.</span><span class="identifier">insert</span><span class="operator">(</span><span class="identifier">statetab</span><span class="operator">[</span><span class="identifier">index</span><span class="operator">]</span><span class="operator">,</span> <span class="identifier">value</span><span class="operator">)</span> +<span class="keyword">end</span> + +<span class="keyword">local</span> <span class="identifier">N</span> <span class="operator">=</span> <span class="number">2</span> +<span class="keyword">local</span> <span class="identifier">MAXGEN</span> <span class="operator">=</span> <span class="number">10000</span> +<span class="keyword">local</span> <span class="identifier">NOWORD</span> <span class="operator">=</span> <span class="operator">"</span><span class="operator">\n</span><span class="operator">"</span> + +<span class="comment">-- </span><span class="identifier">build</span> <span class="identifier">table</span> +<span class="identifier">statetab</span> <span class="operator">=</span> <span class="operator">{</span><span class="operator">}</span> +<span class="keyword">local</span> <span class="identifier">w1</span><span class="operator">,</span> <span class="identifier">w2</span> <span class="operator">=</span> <span class="identifier">NOWORD</span><span class="operator">,</span> <span class="identifier">NOWORD</span> +<span class="keyword">for</span> <span class="identifier">w</span> <span class="keyword">in</span> <span class="identifier">allwords</span><span class="operator">(</span><span class="operator">)</span> <span class="keyword">do</span> + <span class="identifier">insert</span><span class="operator">(</span><span class="identifier">prefix</span><span class="operator">(</span><span class="identifier">w1</span><span class="operator">,</span> <span class="identifier">w2</span><span class="operator">)</span><span class="operator">,</span> <span class="identifier">w</span><span class="operator">)</span> + <span class="identifier">w1</span> <span class="operator">=</span> <span class="identifier">w2</span><span class="operator">;</span> <span class="identifier">w2</span> <span class="operator">=</span> <span class="identifier">w</span><span class="operator">;</span> +<span class="keyword">end</span> +<span class="identifier">insert</span><span class="operator">(</span><span class="identifier">prefix</span><span class="operator">(</span><span class="identifier">w1</span><span class="operator">,</span> <span class="identifier">w2</span><span class="operator">)</span><span class="operator">,</span> <span class="identifier">NOWORD</span><span class="operator">)</span> + + +<span class="comment">-- </span><span class="identifier">generate</span> <span class="identifier">text</span> +<span class="identifier">w1</span> <span class="operator">=</span> <span class="identifier">NOWORD</span><span class="operator">;</span> <span class="identifier">w2</span> <span class="operator">=</span> <span class="identifier">NOWORD</span> <span class="comment">-- </span><span class="identifier">reinitialize</span> +<span class="keyword">for</span> <span class="identifier">i</span><span class="operator">=</span><span class="number">1</span><span class="operator">,</span><span class="identifier">MAXGEN</span> <span class="keyword">do</span> + <span class="keyword">local</span> <span class="identifier">list</span> <span class="operator">=</span> <span class="identifier">statetab</span><span class="operator">[</span><span class="identifier">prefix</span><span class="operator">(</span><span class="identifier">w1</span><span class="operator">,</span> <span class="identifier">w2</span><span class="operator">)</span><span class="operator">]</span> + <span class="comment">-- </span><span class="identifier">choose</span> <span class="identifier">a</span> <span class="identifier">random</span> <span class="identifier">item</span> <span class="identifier">from</span> <span class="identifier">list</span> + <span class="keyword">local</span> <span class="identifier">r</span> <span class="operator">=</span> <span class="identifier">math</span><span class="string">.</span><span class="identifier">random</span><span class="operator">(</span><span class="identifier">table</span><span class="string">.</span><span class="identifier">getn</span><span class="operator">(</span><span class="identifier">list</span><span class="operator">)</span><span class="operator">)</span> + <span class="keyword">local</span> <span class="identifier">nextword</span> <span class="operator">=</span> <span class="identifier">list</span><span class="operator">[</span><span class="identifier">r</span><span class="operator">]</span> + <span class="keyword">if</span> <span class="identifier">nextword</span> <span class="operator">==</span> <span class="identifier">NOWORD</span> <span class="keyword">then</span> <span class="keyword">return</span> <span class="keyword">end</span> + <span class="identifier">io</span><span class="string">.</span><span class="identifier">write</span><span class="operator">(</span><span class="identifier">nextword</span><span class="operator">,</span> <span class="operator">"</span> <span class="operator">"</span><span class="operator">)</span> + <span class="identifier">w1</span> <span class="operator">=</span> <span class="identifier">w2</span><span class="operator">;</span> <span class="identifier">w2</span> <span class="operator">=</span> <span class="identifier">nextword</span> +<span class="keyword">end</span> + +</pre></body></html> |
