Fix 0 being condsidered as comment
This commit is contained in:
parent
6350e1cfef
commit
8c85658297
2 changed files with 21 additions and 17 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef PARSE_HPP
|
#ifndef PARSE_HPP
|
||||||
#define PARSE_HPP
|
#define PARSE_HPP
|
||||||
|
|
||||||
#include "struc.hpp"
|
#include "struc.hpp"
|
||||||
|
|
@ -7,6 +7,16 @@
|
||||||
|
|
||||||
#include <ztd/filedat.hpp>
|
#include <ztd/filedat.hpp>
|
||||||
|
|
||||||
|
#define SPACES " \t"
|
||||||
|
#define SEPARATORS " \t\n"
|
||||||
|
#define ARG_END " \t\n;#()&|"
|
||||||
|
#define COMMAND_SEPARATOR "\n;"
|
||||||
|
#define CONTROL_END "#)"
|
||||||
|
#define PIPELINE_END "\n;#()&"
|
||||||
|
#define ARGLIST_END "\n;#()&|"
|
||||||
|
#define SPECIAL_TOKENS "\n;#()&|"
|
||||||
|
#define ALL_TOKENS "\n;#()&|{}"
|
||||||
|
|
||||||
extern std::string g_origin;
|
extern std::string g_origin;
|
||||||
|
|
||||||
std::string import_file(std::string const& path);
|
std::string import_file(std::string const& path);
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,6 @@
|
||||||
|
|
||||||
std::string g_origin;
|
std::string g_origin;
|
||||||
|
|
||||||
const char* SPACES=" \t";
|
|
||||||
const char* SEPARATORS=" \t\n";
|
|
||||||
const char* ARG_END=" \t&|;\n#()";
|
|
||||||
const char* SPECIAL_TOKENS="&|;\n#()";
|
|
||||||
const char* ALL_TOKENS="&|;\n#(){}";
|
|
||||||
|
|
||||||
const std::vector<std::string> reserved_words = { "if", "then", "else", "fi", "case", "esac", "for", "while", "until", "do", "done", "{", "}" };
|
const std::vector<std::string> reserved_words = { "if", "then", "else", "fi", "case", "esac", "for", "while", "until", "do", "done", "{", "}" };
|
||||||
|
|
||||||
std::string g_expecting;
|
std::string g_expecting;
|
||||||
|
|
@ -263,6 +257,8 @@ std::pair<arg*, uint32_t> parse_arg(const char* in, uint32_t size, uint32_t star
|
||||||
ret->sa.push_back(new subarg_subshell(r.first));
|
ret->sa.push_back(new subarg_subshell(r.first));
|
||||||
j = i = r.second;
|
j = i = r.second;
|
||||||
}
|
}
|
||||||
|
else if( word_eq("$#", in, size, i) )
|
||||||
|
i+=2;
|
||||||
else
|
else
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
@ -343,9 +339,9 @@ std::pair<pipeline*, uint32_t> parse_pipeline(const char* in, uint32_t size, uin
|
||||||
auto pp=parse_block(in, size, i);
|
auto pp=parse_block(in, size, i);
|
||||||
ret->add(pp.first);
|
ret->add(pp.first);
|
||||||
i = skip_chars(in, size, pp.second, SPACES);
|
i = skip_chars(in, size, pp.second, SPACES);
|
||||||
if( i>=size || is_in(in[i], "&;\n#)") || word_eq("||", in, size, i) )
|
if( i>=size || is_in(in[i], PIPELINE_END) || word_eq("||", in, size, i) )
|
||||||
return std::make_pair(ret, i);
|
return std::make_pair(ret, i);
|
||||||
else if( in[i] != '|')
|
else if( in[i] != '|' )
|
||||||
throw ztd::format_error( strf("Unexpected token: '%c'", in[i] ), g_origin, in, i);
|
throw ztd::format_error( strf("Unexpected token: '%c'", in[i] ), g_origin, in, i);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
@ -374,11 +370,11 @@ std::pair<condlist*, uint32_t> parse_condlist(const char* in, uint32_t size, uin
|
||||||
auto pp=parse_pipeline(in, size, i);
|
auto pp=parse_pipeline(in, size, i);
|
||||||
ret->add(pp.first, optype);
|
ret->add(pp.first, optype);
|
||||||
i = pp.second;
|
i = pp.second;
|
||||||
if(i>=size || is_in(in[i], ")#")) // end here exactly: used for control later
|
if(i>=size || is_in(in[i], CONTROL_END)) // end here exactly: used for control later
|
||||||
{
|
{
|
||||||
return std::make_pair(ret, i);
|
return std::make_pair(ret, i);
|
||||||
}
|
}
|
||||||
else if(is_in(in[i], ";\n")) // end one char after: skip them for next parse
|
else if(is_in(in[i], COMMAND_SEPARATOR)) // end one char after: skip them for next parse
|
||||||
{
|
{
|
||||||
return std::make_pair(ret, i+1);
|
return std::make_pair(ret, i+1);
|
||||||
}
|
}
|
||||||
|
|
@ -398,10 +394,8 @@ std::pair<condlist*, uint32_t> parse_condlist(const char* in, uint32_t size, uin
|
||||||
i += 2;
|
i += 2;
|
||||||
optype=OR_OP;
|
optype=OR_OP;
|
||||||
}
|
}
|
||||||
else if(i<size-1) // bad combination
|
else
|
||||||
throw ztd::format_error( strf("Unexpected token: '%c%c'", in[i], in[i+1]), g_origin, in, i);
|
throw ztd::format_error( strf("Unexpected token: '%c'", in[i]), g_origin, in, i);
|
||||||
else // unknown
|
|
||||||
throw ztd::format_error("Unknown error", g_origin, in, i);
|
|
||||||
i = skip_unread(in, size, i);
|
i = skip_unread(in, size, i);
|
||||||
if(i>=size)
|
if(i>=size)
|
||||||
throw ztd::format_error( "Unexpected end of file", g_origin, in, i );
|
throw ztd::format_error( "Unexpected end of file", g_origin, in, i );
|
||||||
|
|
@ -660,7 +654,7 @@ std::pair<case_block*, uint32_t> parse_case(const char* in, uint32_t size, uint3
|
||||||
i=skip_unread(in, size, i+2);
|
i=skip_unread(in, size, i+2);
|
||||||
|
|
||||||
// parse all cases
|
// parse all cases
|
||||||
while(i<size && !word_eq("esac", in, size, i, " \t\n;()&") )
|
while(i<size && !word_eq("esac", in, size, i, ARG_END) )
|
||||||
{
|
{
|
||||||
// add one element
|
// add one element
|
||||||
ret->cases.push_back( std::pair<arglist_t, list_t>() );
|
ret->cases.push_back( std::pair<arglist_t, list_t>() );
|
||||||
|
|
@ -919,7 +913,7 @@ std::pair<block*, uint32_t> parse_fct_or_cmd(const char* in, uint32_t size, uint
|
||||||
// detect if brace, subshell, case or other
|
// detect if brace, subshell, case or other
|
||||||
std::pair<block*, uint32_t> parse_block(const char* in, uint32_t size, uint32_t start)
|
std::pair<block*, uint32_t> parse_block(const char* in, uint32_t size, uint32_t start)
|
||||||
{
|
{
|
||||||
uint32_t i = skip_chars(in, size, start, " \n\t");
|
uint32_t i = skip_chars(in, size, start, SEPARATORS);
|
||||||
block* ret = nullptr;
|
block* ret = nullptr;
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue