create account

Writing a simple Compiler on my own - Revisit Queue and Assignment Checking (part 3) [C][Flex][Bison] by drifter1

View this thread on: hive.blogpeakd.comecency.com
· @drifter1 ·
$22.58
Writing a simple Compiler on my own - Revisit Queue and Assignment Checking (part 3) [C][Flex][Bison]
<html>
https://i.postimg.cc/ZRn570TY/part3.jpg<br>
[Custom Thumbnail]<br>
All the Code of the series can be found at the <strong>Github repository</strong>:
https://github.com/drifter1/compiler
<hr>
<h1>Introduction</h1>&nbsp;&nbsp;&nbsp;&nbsp;Hello it's a me again @drifter1! Today we continue with my <strong>Compiler Series</strong>, a series where we implement a complete compiler for a simple C-like language by using the C-tools Flex and Bison. In this article we will continue with the implementation of Assignment checking using the Revisit Queue.
<h2>The topics that we will cover today are:</h2>
<ol>
<li>Parser integration</li>
<li>Running for examples</li>
</ol>
<h2>Requirements:</h2>&nbsp;&nbsp;&nbsp;&nbsp;Actually <strong>you need to read and understand all the topics that I covered in the series as a whole</strong>, as these articles will give you access to knowledge about:<ul>
<li>What Compiler Design is (mainly the steps)</li>
<li>For which exact Language the Compiler is build for (Tokens and Grammar)</li>
<li>How to use Flex and Bison</li>
<li>How to implement a lexer and parser for the language using those tools</li>
<li>What the Symbol Table is and how we implement it</li>
<li>How we combine Flex and Bison together</li>
<li>How we can pass information from the Lexer to the Parser</li>
<li>How we define operator priorities, precedencies and associativity</li>
<li>What Semantic Analysis is (Attributes, SDT etc.)</li>
<li>How we do the so called "Scope Resolution"</li>
<li>How we declare types and check the type inter-compatibility for different cases, including function parameters</li>
<li>How we check function calls later on using a "Revisit queue", as function declarations mostly happen after functions get used (in our Language)</li>
<li>Intermediate Code Representations, including AST's</li>
<li>How we implement an AST (structure and management)</li>
<li>Action Rules for AST nodes and more</li>
</ul>
<h2>Difficulty:</h2>Talking about the <strong>series in general</strong> this series can be rated:
<ul><li>Intermediate to Advanced</li></ul>
<strong>Today's topic(s)</strong> can be rated:
<ul><li>Medium</li></ul>
So, without further ado, let's now finally start with the actual Tutorial...
<hr>
<h1>Actual Tutorial Content</h1>
<h2>Parser integration</h2>&nbsp;&nbsp;&nbsp;&nbsp;By making all the necessary changes to the Revisit queue structure (and it's functions) and the "expression_data_type" function, we now just have to integrate those changes into the parser's action rules. In the first part we visualized the problem, creating this complete diagram that explains the whole procedure:<br>
https://i.postimg.cc/W4C1yTtM/diagram.jpg<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;Thinking about the "expression_data_type" function, this function will be called during the <strong>action rule of assignments</strong> to get the datatype of the right side of an assignment. We are <strong>setting the flag variable "cont_revisit" to 1 whenever we find an undefined function return type</strong>. This means that we can check the value of this variable and <strong>either perform the assignment check directly</strong> (cont_revisit == 0 - contains no undeclared function call) <strong>or add the new expression to a revisit queue entry</strong> (cont_revisit == 1). We might have created such an entry for the current identifier previously and so using the "search_queue" function is wise. We will create a new entry only if no entry exists (search_queue returns NULL). If an entry exists we manage the array, add the new info (expression node), increment the assignment counter and should also not forget to reset the revisit flag to 0. In the end after the whole parsing is done we will perform all those missing assignment checks!<br><br>
Based on all this, the assignment rule's action code looks as following:<br>
<pre><code>assigment: var_ref ASSIGN expression
{
	AST_Node_Ref *temp = (AST_Node_Ref*) $1;
	$$ = new_ast_assign_node(temp->entry, temp->ref, $3);<br>
	/* find datatypes */
	int type1 = get_type(temp->entry->st_name);
	int type2 = expression_data_type($3);<br>
	/* the last function will give us information about revisits */<br>
	/* contains revisit => add assignment-check to revisit queue */
	if(cont_revisit == 1){	
		/* search if entry exists */
		revisit_queue *q = search_queue(temp->entry->st_name);
		if(q == NULL){
			add_to_queue(temp->entry, temp->entry->st_name, ASSIGN_CHECK);
			q = search_queue(temp->entry->st_name);	
		}<br>
		/* setup structures */
		if(q->num_of_assigns == 0){ /* first node */
			q->nodes = (void**) malloc(sizeof(void*));
		}
		else{ /* general case */
			q->nodes = (void**) realloc(q->nodes, (q->num_of_assigns + 1) * sizeof(void*));
		}<br>
		/* add info of assignment */
		q->nodes[q->num_of_assigns] = (void*) $3;<br>
		/* increment number of assignments */
		q->num_of_assigns++;<br>
		/* reset revisit flag */
		cont_revisit = 0;<br>
		printf("Assignment revisit for %s at line %d\n", temp->entry->st_name, lineno);
	}
	else{ /* no revisit */
		/* check assignment semantics */
		get_result_type(
			type1,       /*  variable datatype  */
			type2,       /* expression datatype */
			NONE  /* checking compatibility only (no operator) */
		);
	}
}
;</code></pre><br><br>
&nbsp;&nbsp;&nbsp;&nbsp;By adding the upper action code we perform the assignment checks that don't contain function calls. Those that can't be performed will be in the revisit queue waiting for us! By not revisiting them after the parsing is done, the revisit queue dump file for the "full_example.c" file, look like this:<br>
https://i.postimg.cc/fRbH2hGW/image.png<br><br>
We will get more into that later!<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;Performing those remaining checks is quite simple! We just have to loop through the revisit queue and perform the revisit for each assignment check, checking if the revisit_type entry has the value ASSIGN_CHECK. Afterwards we will only get a warning for the cases where a functions never being declared! In code all this looks like this:<br>
<pre><code>/* perform the remaining checks (assignments) */
if(queue != NULL){
	revisit_queue *cur;
	cur = queue;
	while(cur != NULL){
		if(cur->revisit_type == ASSIGN_CHECK){
			revisit(cur->st_name);
		}
		cur = cur->next;
	}
}</code></pre>
<hr>
<h2>Running for examples</h2>&nbsp;&nbsp;&nbsp;&nbsp;Let's now run our code for the "example2" and "full_example" programs, to understand better what happens!
<h3>example2</h3>The example code looks like this:<br>
<pre><code>// main function
int i;
double val = 2.5, res[10];
for(i = 0; i < 10; i++){
    res[i] = operation(val, i);
    val = res[i];
    print(res[i]);
    print('\n');
}
return;
// functions
double operation (double value, int i){
    double res;
    res = value*i + i;
    return res;
}</code></pre>&nbsp;&nbsp;&nbsp;&nbsp;As you can see this code contains one function declaration, which is being used in one assignment of the double array "res". Including a message in the console, whenever an assignment needs a revisit, we can run the compiler for this example, to see if the assignment check was really delayed in line 7 of the program. Taking a look at the console we see:<br>
https://i.postimg.cc/hvSwKQ5T/image.png<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;We clearly add the "res[i] = operation(val, i)" assignment to the revisit queue. Taking a look at the end of the console, we can see that no error was printed!<br>
 https://i.postimg.cc/Wzb9BLd7/image.png<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;So, this means that the assignment check that was inside of the revisit queue was performed correctly, as it should! Let's comment out this revisiting to see what would be inside of the "revisit_dump" file.<br>
https://i.postimg.cc/tCndY4Gx/image.png<br><br>
You can see that we only have to perform one assignment check (the one from line 7) in a revisit !
<h3>full_example</h3>&nbsp;&nbsp;&nbsp;&nbsp;In the same way the "full_example" code contains assignments that contain function calls in 3 places, where two are for the same variable 'p'. That way the console would print out the following:<br>
https://i.postimg.cc/DfXPBPBN/image.png<br><br>
The revisit_dump (by commenting out the revisit) contains:<br>
https://i.postimg.cc/rmWRCQMC/image.png<br><br>
Adding the code back in, the console contains no warning anymore and the revisit_dump is empty!
<hr>
<h2>RESOURCES</h2>
<h3>References:</h3>
No references, just using code that I implemented in my previous articles.
<h3>Images:</h3>
All of the images are custom-made!
<hr>
<h2>Previous parts of the series</h2>
<h3>General Knowledge and Lexical Analysis</h3>
<ul>
<li><a href="https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-introduction">Introduction</a></li>
<li><a href="https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-a-simple-c-language">A simple C Language</a></li>
<li><a href="https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-lexical-analysis-using-flex">Lexical Analysis using Flex</a></li>
<li><a href="https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-symbol-table-basic-structure">Symbol Table (basic structure)</a></li>
<li><a href="https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-using-symbol-tables-in-the-lexer">Using Symbol Table in the Lexer</a></li>
</ul>
<h3>Syntax Analysis</h3>
</ul>
<li><a href="https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-syntax-analysis-theory">Syntax Analysis Theory</a></li>
<li><a href="https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-bison-basics">Bison basics</a></li>
<li><a href="https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-creating-a-grammar-for-our-language">Creating a grammar for our Language</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-combine-flex-and-bison">Combine Flex and Bison</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-passing-information-from-lexer-to-parser">Passing information from Lexer to Parser</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-finishing-off-the-grammer-parser-part-1">Finishing Off The Grammar/Parser (part 1)</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-finishing-off-the-grammar-parser-part-2-c-flex-bison">Finishing Off The Grammar/Parser (part 2)</a></li>
</ul>
<h3>Semantic Analysis (1)</h3>
</ul>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-semantic-analysis-theory-c-flex-bison">Semantic Analysis Theory</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-semantics-examples-c-flex-bison">Semantics Examples</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own---scope-resolution-using-the-symbol-table-cflexbison">Scope Resolution using the Symbol Table</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-type-declaration-and-checking-c-flex-bison">Type Declaration and Checking</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-function-semantics-part-1-c-flex-bison">Function Semantics (part 1)</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-function-semantics-part-2-c-flex-bison">Function Semantics (part 2)</a></li>
</ul>
<h3>Intermediate Code Generation (AST)</h3>
</ul>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-abstract-syntax-tree-principle-c-flex-bison">Abstract Syntax Tree Principle</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-abstract-syntax-tree-structure-c-flex-bison">Abstract Syntax Tree Structure</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-abstract-syntax-tree-management-c-flex-bison">Abstract Syntax Tree Management</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-action-rules-for-declarations-and-initializations-c-flex-bison">Action Rules for Declarations and Initializations</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-action-rules-for-expressions-c-flex-bison">Action Rules for Expressions</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-action-rules-for-assignments-and-simple-statements-c-flex-bison">Action Rules for Assignments and Simple Statements</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-action-rules-for-if-else-statements-c-flex-bison">Action Rules for  If-Else Statements</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-action-rules-for-loop-statements-and-some-fixes-c-flex-bison">Action Rules for Loop Statements and some Fixes</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-action-rules-for-function-declarations-part-1-c-flex-bison">Action Rules for Function Declarations (part 1)</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-action-rules-for-function-declarations-part-2-c-flex-bison">Action Rules for Function Declarations (part 2)</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-action-rules-for-function-calls-c-flex-bison">Action Rules for Function Calls</a></li>
</ul>
<h3>Semantic Analysis (2)</h3>
</ul>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-datatype-attribute-for-expressions-c-flex-bison">Datatype attribute for Expressions</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-type-checking-for-assignments-c-flex-bison">Type Checking for Assignments </a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-revisit-queue-and-parameter-checking-part-1-c-flex-bison">Revisit Queue and Parameter Checking (part 1)</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-revisit-queue-and-parameter-checking-part-2-c-flex-bison">Revisit Queue and Parameter Checking (part 2)</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-revisit-queue-and-parameter-checking-part-3-c-flex-bison">Revisit Queue and Parameter Checking (part 3)</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-revisit-queue-and-parameter-checking-part-4-c-flex-bison">Revisit Queue and Parameter Checking (part 4)</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-revisit-queue-and-assignment-checking-part-1-c-flex-bison">Revisit Queue and Assignment Checking (part 1)</a></li>
<li><a href="https://steemit.com/utopian-io/@drifter1/writing-a-simple-compiler-on-my-own-revisit-queue-and-assignment-checking-part-2-c-flex-bison">Revisit Queue and Assignment Checking (part 2)</a></li>
</ul>
<hr>
<h2>Final words | Next up on the project</h2>&nbsp;&nbsp;&nbsp;&nbsp; And this is actually it for today's post! I hope that I explained everything as much as I needed to, meaning that you learned something out of it.<br>
Next up on this series are:
<ul>
<li>Semantic analysis (using even more action rules in Bison)</li>
<li>Machine Code generation (MIPS Assembly)</li>
</ul>
&nbsp;&nbsp;&nbsp;&nbsp; Which are all topics that will need more than one article to complete. Also, note that we might also get into Optimizations later on, or could even extend the Language by adding complex datatypes (structs and unions), more rules etc.<br>
So, see ya next time!
<hr>
<h2>GitHub Account:</h2>
https://github.com/drifter1<br>
https://steemitimages.com/0x0/https://media.giphy.com/media/ybITzMzIyabIs/giphy.gif
<br>
Keep on drifting! ;)
</html>
πŸ‘  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , and 70 others
properties (23)
authordrifter1
permlinkwriting-a-simple-compiler-on-my-own-revisit-queue-and-assignment-checking-part-3-c-flex-bison
categoryutopian-io
json_metadata{"community":"busy","app":"busy/2.5.6","format":"markdown","tags":["utopian-io","tutorials","busy","programming","compiler"],"users":["drifter1"],"links":["https://github.com/drifter1/compiler","/@drifter1","https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-introduction","https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-a-simple-c-language","https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-lexical-analysis-using-flex","https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-symbol-table-basic-structure","https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-using-symbol-tables-in-the-lexer","https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-syntax-analysis-theory","https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-bison-basics","https://steemit.com/programming/@drifter1/writing-a-simple-compiler-on-my-own-creating-a-grammar-for-our-language"],"image":["https://i.postimg.cc/ZRn570TY/part3.jpg","https://i.postimg.cc/W4C1yTtM/diagram.jpg","https://i.postimg.cc/fRbH2hGW/image.png","https://i.postimg.cc/hvSwKQ5T/image.png","https://i.postimg.cc/Wzb9BLd7/image.png","https://i.postimg.cc/tCndY4Gx/image.png","https://i.postimg.cc/DfXPBPBN/image.png","https://i.postimg.cc/rmWRCQMC/image.png","https://steemitimages.com/0x0/https://media.giphy.com/media/ybITzMzIyabIs/giphy.gif"]}
created2019-01-26 08:08:45
last_update2019-01-26 08:08:45
depth0
children5
last_payout2019-02-02 08:08:45
cashout_time1969-12-31 23:59:59
total_payout_value17.175 HBD
curator_payout_value5.402 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length16,284
author_reputation98,202,866,830,354
root_title"Writing a simple Compiler on my own - Revisit Queue and Assignment Checking (part 3) [C][Flex][Bison]"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id78,954,530
net_rshares46,001,027,903,097
author_curate_reward""
vote details (134)
@portugalcoin ·
$5.77
Thank you for your contribution @drifter1.
After analyzing your tutorial we suggest the following point:

- In my opinion for your tutorial to look more professional it would be interesting to have the flowchart this way, for example:

![11.png](https://cdn.steemitimages.com/DQmWHf2MrJntjat2p389ajMVvMvnfCNZ8J7ZvDkGXm7rtoy/11.png)

- Using GIFs to demonstrate the results would also be more appealing to the reader.

As always you present good tutorials and interesting content. Thank you for your work in developing tutorials.

Your contribution has been evaluated according to [Utopian policies and guidelines](https://join.utopian.io/guidelines), as well as a predefined set of questions pertaining to the category.

To view those questions and the relevant answers related to your post, [click here](https://review.utopian.io/result/8/2-1-1-1-3-2-1-3-).

---- 
Need help? Chat with us on [Discord](https://discord.gg/uTyJkNm).

[[utopian-moderator]](https://join.utopian.io/)
πŸ‘  , , , , , , , , , , , , , , , , , , ,
properties (23)
authorportugalcoin
permlinkre-drifter1-writing-a-simple-compiler-on-my-own-revisit-queue-and-assignment-checking-part-3-c-flex-bison-20190126t125204632z
categoryutopian-io
json_metadata{"tags":["utopian-io"],"users":["drifter1"],"image":["https://cdn.steemitimages.com/DQmWHf2MrJntjat2p389ajMVvMvnfCNZ8J7ZvDkGXm7rtoy/11.png"],"links":["https://join.utopian.io/guidelines","https://review.utopian.io/result/8/2-1-1-1-3-2-1-3-","https://discord.gg/uTyJkNm","https://join.utopian.io/"],"app":"steemit/0.1"}
created2019-01-26 12:52:03
last_update2019-01-26 12:52:03
depth1
children1
last_payout2019-02-02 12:52:03
cashout_time1969-12-31 23:59:59
total_payout_value4.383 HBD
curator_payout_value1.387 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length980
author_reputation599,460,589,822,571
root_title"Writing a simple Compiler on my own - Revisit Queue and Assignment Checking (part 3) [C][Flex][Bison]"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id78,962,218
net_rshares11,682,687,482,508
author_curate_reward""
vote details (20)
@utopian-io ·
Thank you for your review, @portugalcoin! Keep up the good work!
properties (22)
authorutopian-io
permlinkre-re-drifter1-writing-a-simple-compiler-on-my-own-revisit-queue-and-assignment-checking-part-3-c-flex-bison-20190126t125204632z-20190128t131026z
categoryutopian-io
json_metadata"{"app": "beem/0.20.17"}"
created2019-01-28 13:10:27
last_update2019-01-28 13:10:27
depth2
children0
last_payout2019-02-04 13:10:27
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length64
author_reputation152,955,367,999,756
root_title"Writing a simple Compiler on my own - Revisit Queue and Assignment Checking (part 3) [C][Flex][Bison]"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id79,058,722
net_rshares0
@steem-ua ·
#### Hi @drifter1!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your post is eligible for our upvote, thanks to our collaboration with @utopian-io!
**Feel free to join our [@steem-ua Discord server](https://discord.gg/KpBNYGz)**
πŸ‘  , ,
properties (23)
authorsteem-ua
permlinkre-writing-a-simple-compiler-on-my-own-revisit-queue-and-assignment-checking-part-3-c-flex-bison-20190126t125812z
categoryutopian-io
json_metadata"{"app": "beem/0.20.14"}"
created2019-01-26 12:58:12
last_update2019-01-26 12:58:12
depth1
children0
last_payout2019-02-02 12:58:12
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length287
author_reputation23,214,230,978,060
root_title"Writing a simple Compiler on my own - Revisit Queue and Assignment Checking (part 3) [C][Flex][Bison]"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id78,962,425
net_rshares17,608,759,446
author_curate_reward""
vote details (3)
@steemitboard ·
Congratulations @drifter1! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

<table><tr><td>https://steemitimages.com/60x70/http://steemitboard.com/@drifter1/votes.png?201901280225</td><td>You made more than 13000 upvotes. Your next target is to reach 14000 upvotes.</td></tr>
</table>

<sub>_[Click here to view your Board](https://steemitboard.com/@drifter1)_</sub>
<sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub>



> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
πŸ‘  
properties (23)
authorsteemitboard
permlinksteemitboard-notify-drifter1-20190128t043205000z
categoryutopian-io
json_metadata{"image":["https://steemitboard.com/img/notify.png"]}
created2019-01-28 04:32:03
last_update2019-01-28 04:32:03
depth1
children0
last_payout2019-02-04 04:32:03
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length749
author_reputation38,975,615,169,260
root_title"Writing a simple Compiler on my own - Revisit Queue and Assignment Checking (part 3) [C][Flex][Bison]"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id79,043,009
net_rshares16,468,727,287
author_curate_reward""
vote details (1)
@utopian-io ·
Hey, @drifter1!

**Thanks for contributing on Utopian**.
We’re already looking forward to your next contribution!

**Get higher incentives and support Utopian.io!**
 Simply set @utopian.pay as a 5% (or higher) payout beneficiary on your contribution post (via [SteemPlus](https://chrome.google.com/webstore/detail/steemplus/mjbkjgcplmaneajhcbegoffkedeankaj?hl=en) or [Steeditor](https://steeditor.app)).

**Want to chat? Join us on Discord https://discord.gg/h52nFrV.**

<a href='https://steemconnect.com/sign/account-witness-vote?witness=utopian-io&approve=1'>Vote for Utopian Witness!</a>
πŸ‘  
properties (23)
authorutopian-io
permlinkre-writing-a-simple-compiler-on-my-own-revisit-queue-and-assignment-checking-part-3-c-flex-bison-20190126t133432z
categoryutopian-io
json_metadata"{"app": "beem/0.20.17"}"
created2019-01-26 13:34:33
last_update2019-01-26 13:34:33
depth1
children0
last_payout2019-02-02 13:34:33
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length590
author_reputation152,955,367,999,756
root_title"Writing a simple Compiler on my own - Revisit Queue and Assignment Checking (part 3) [C][Flex][Bison]"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id78,964,148
net_rshares16,220,677,163
author_curate_reward""
vote details (1)