From dbe1b719f8037dda23279b8bc7d8200578415e15 Mon Sep 17 00:00:00 2001 From: marha Date: Fri, 4 Mar 2011 11:26:33 +0000 Subject: Implement eval sort warning functions (see gnu make manual for description) Solved errors in if and foreach implementations Removed message and reparse function (use info and eval instead) $n can be used to add new line define can be used to specify multi-line macros Solved error in argument expansion in call function --- tools/mhmake/src/mhmakelexer.l | 115 +++++++++-------------------------------- 1 file changed, 23 insertions(+), 92 deletions(-) (limited to 'tools/mhmake/src/mhmakelexer.l') diff --git a/tools/mhmake/src/mhmakelexer.l b/tools/mhmake/src/mhmakelexer.l index f27fec31a..aa396ceaf 100644 --- a/tools/mhmake/src/mhmakelexer.l +++ b/tools/mhmake/src/mhmakelexer.l @@ -95,7 +95,7 @@ static void ReplaceCurlyBraces(string &String) /* -------------- rules section -------------- */ %x INCLUDE IFDEF IF IFNDEF SKIPUNTILELSEORENDIF QUOTE MAKEEXPRES SINGLEQUOTE COMMANDPARSE -%x IFEQ IFNEQ ERRORMACRO MESSAGEMACRO REPARSEMACRO LOAD_MAKEFILE +%x IFEQ IFNEQ LOAD_MAKEFILE %x DEFINE %{ @@ -463,7 +463,7 @@ load_makefile { \r /* skip */ -[^\\\r\n\$]+ | +[^\\\r\n\$#]+ | [\\\$] { m_curtoken += (const char *)yytext; } /*****************************************************************************/ @@ -608,7 +608,7 @@ load_makefile { } /*---------------------------------------------------------------------------*/ -[ \t]*#[^\n]* { +[ \t]*#[^\n]* { PRINTF(("%s %d: -COMMENT: %s\n",m_InputFileName.c_str(),lineno(),yytext)); } @@ -678,7 +678,7 @@ export { return yy::mhmakeparser::token::STRING; } -([a-zA-Z0-9\\\._\~\-\+%\@<&;/\*\|]|\\\ |\\#)+ { +([a-zA-Z0-9\\\._\~\-\+%\@<&;/\*\|\[\]]|\\\ |\\#)+ { PRINTF(("%s %d: STRING: %s\n",m_InputFileName.c_str(),lineno(),yytext)); yylval->theString=(const char *)yytext; return yy::mhmakeparser::token::STRING; @@ -701,6 +701,11 @@ export { m_curtoken+=g_SpaceString; } +\n { + inclineno(); + m_curtoken+=(const char *)yytext; +} + . { m_curtoken+=(const char *)yytext; } @@ -733,33 +738,6 @@ export { m_curtoken=(const char *)yytext; } - /*---------------------------------------------------------------------------*/ -\$[\(\{][ \t]*error[ \t]+ { - m_BraceIndent++; - PRINTF(("%s %d: BEGIN ERROR MACRO $(: %d\n",m_InputFileName.c_str(),lineno(),m_BraceIndent)); - BEGIN(ERRORMACRO); - m_curtoken=g_EmptyString; - return yy::mhmakeparser::token::NEWLINE; // Make sure that the previous lines are matched by the bison parser (so that all variables until here are defined) -} - - /*---------------------------------------------------------------------------*/ -\$[\(\{][ \t]*(message|info)[ \t]+ { - m_BraceIndent++; - PRINTF(("%s %d: BEGIN MESSAGE MACRO $(: %d\n",m_InputFileName.c_str(),lineno(),m_BraceIndent)); - BEGIN(MESSAGEMACRO); - m_curtoken=g_EmptyString; - return yy::mhmakeparser::token::NEWLINE; // Make sure that the previous lines are matched by the bison parser (so that all variables until here are defined) -} - - /*---------------------------------------------------------------------------*/ -\$[\(\{][ \t]*reparse[ \t]+ { - m_BraceIndent++; - PRINTF(("%s %d: BEGIN REPARSE MACRO $(: %d\n",m_InputFileName.c_str(),lineno(),m_BraceIndent)); - BEGIN(REPARSEMACRO); - m_curtoken=g_EmptyString; - return yy::mhmakeparser::token::NEWLINE; -} - /*---------------------------------------------------------------------------*/ \$[<@/$] { PRINTF(("%s %d: DOLLAREXPR: %s\n",m_InputFileName.c_str(),lineno(),yytext)); @@ -833,11 +811,6 @@ export { m_curtoken+='#'; } - /*---------------------------------------------------------------------------*/ -[ \t]*#[^\n]* { - PRINTF(("%s %d: -COMMENT: %s\n",m_InputFileName.c_str(),lineno(),yytext)); -} - /*****************************************************************************/ \" { PRINTF(("%s %d: QUOTEDSTRING: %s\n",m_InputFileName.c_str(),lineno(),yytext)); @@ -874,58 +847,6 @@ export { yymore(); } - /*****************************************************************************/ -[\)\}] { - m_BraceIndent--; - PRINTF(("%s %d: CLOSE BRACE ERROR MACRO ): %d\n",m_InputFileName.c_str(),lineno(),m_BraceIndent)); - if (!m_BraceIndent) - { - PRINTF(("%s %d: ERRORMACRO: %s\n",m_InputFileName.c_str(),lineno(),m_curtoken.c_str())); - throw string("\n-> ")+m_InputFileName.c_str()+"("+stringify(lineno())+") : "+GetParser()->ExpandExpression(m_curtoken); - } else { - m_curtoken+=(const char *)yytext; -} -} - - /*****************************************************************************/ -[\)\}] { - m_BraceIndent--; - PRINTF(("%s %d: CLOSE BRACE MESSAGE MACRO ): %d\n",m_InputFileName.c_str(),lineno(),m_BraceIndent)); - if (!m_BraceIndent) - { - PRINTF(("%s %d: MESSAGEMACRO: %s\n",m_InputFileName.c_str(),lineno(),yytext)); - cerr<ExpandExpression(m_curtoken)<[\)\}] { - m_BraceIndent--; - PRINTF(("%s %d: CLOSE BRACE REPARSE MACRO ): %d\n",m_InputFileName.c_str(),lineno(),m_BraceIndent)); - if (!m_BraceIndent) - { - PRINTF(("%s %d: REPARSEMACRO: %s\n",m_InputFileName.c_str(),lineno(),yytext)); - string Deps=GetParser()->ExpandExpression(m_curtoken); - PRINTF(("%s %d: REPARSEMACRO expanded: %s\n",m_InputFileName.c_str(),lineno(),Deps.c_str())); - string::const_reverse_iterator It=Deps.rbegin()+1; // +1 because we don't want the latest brace - string::const_reverse_iterator ItBeg=Deps.rend(); - while (It!= ItBeg) - { - char Char=*It++; - if (Char==';') Char='\n'; - unput(Char); - } - BEGIN(INITIAL); - } - else - { - m_curtoken+=(const char *)yytext; - } -} - /*****************************************************************************/ [\)\}] { m_BraceIndent--; @@ -945,22 +866,32 @@ export { } /*---------------------------------------------------------------------------*/ -\$[\(\{] { +\$[\(\{] { m_BraceIndent++; PRINTF(("%s %d: MACRO extra $(: %d\n",m_InputFileName.c_str(),lineno(),m_BraceIndent)); m_curtoken+=(const char *)yytext; } /*---------------------------------------------------------------------------*/ -[^$\(\)\{\}\r\n\\]+ | -[\(\$\\\{] { +[\(\{] { + m_BraceIndent++; m_curtoken+=(const char *)yytext; } -[ \t\r]*\\[ \t\r]*\n[ \t\r]* { + + /*---------------------------------------------------------------------------*/ +[^$\(\)\{\}\r\n\\]+ | +[\(\$\\\{] { + m_curtoken+=(const char *)yytext; +} +[ \t\r]*\\[ \t\r]*\n[ \t\r]* { inclineno(); m_curtoken+=g_SpaceString; } +\n { + throw m_InputFileName + "(" + stringify(lineno()) + "): End of line inside macro is not allowed"; +} + <> { throw string("Missing endif or else statement. #else or #endif used?"); } -- cgit v1.2.3