From 9ae42db76c0b7a7f688f62c76e163ec0fa590041 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Thu, 24 Oct 2019 15:14:42 +0800 Subject: [PATCH] Fixed bugs in lexer & parser::loop --- version1.2/nasal_lexer.h | 12 ++++++++++-- version1.2/nasal_parser.h | 13 +++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/version1.2/nasal_lexer.h b/version1.2/nasal_lexer.h index 988a4bd..01bc9fc 100644 --- a/version1.2/nasal_lexer.h +++ b/version1.2/nasal_lexer.h @@ -81,17 +81,25 @@ class resource_programme_process } memset(resource,0,sizeof(char)); int i=0; + int instring=0; bool findnote=false;// to find the note with # at the head of line. while(!fin.eof()) { resource[i]=fin.get(); + if(resource[i]=='\'' || resource[i]=='\"') + ++instring; if(resource[i]=='\n') findnote=false; //when meeting '\n' the findnote is set to false then the next statement can be executed. if(resource[i]!='#' && !findnote) ++i; else if(resource[i]=='#') - findnote=true; + { + if(instring & 1) + ++i; + else + findnote=true; + } if(fin.eof()) break; } @@ -458,7 +466,7 @@ class nasal_lexer else if((*i).content=="<=") (*i).type=__cmp_less_or_equal; } - else if(((*i).content==";") || ((*i).content==",") || ((*i).content=="=") || ((*i).content==":") || ((*i).content==".") || ((*i).content=="?") || ((*i).content=="|") || ((*i).content=="%") || ((*i).content=="$") || ((*i).content=="`") || ((*i).content=="^") || ((*i).content=="@")) + else if(((*i).content==";") || ((*i).content==",") || ((*i).content=="=") || ((*i).content==":") || ((*i).content==".") || ((*i).content=="?") || ((*i).content=="|") || ((*i).content=="&") || ((*i).content=="%") || ((*i).content=="$") || ((*i).content=="`") || ((*i).content=="^") || ((*i).content=="@")) { char c=(*i).content[0]; switch(c) diff --git a/version1.2/nasal_parser.h b/version1.2/nasal_parser.h index a95141a..d01b12e 100644 --- a/version1.2/nasal_parser.h +++ b/version1.2/nasal_parser.h @@ -958,6 +958,7 @@ abstract_syntax_tree nasal_parser::loop_expr() node.add_child(definition_expr()); break; case __id: + parse.push(this_token); node.add_child(calculation_expr()); break; case __semi:parse.push(this_token);break; @@ -1235,6 +1236,12 @@ abstract_syntax_tree nasal_parser::mul_div_operator_expr() while(1) { get_token(); + if(this_token.type==__unknown_operator) + { + ++error; + std::cout<<">>[Error] line "<>[Error] line "<