argv[iCurArg][0] != '-' || /* Not a param. */
argv[iCurArg][1] == 0 ) { /* Only a dash. */
parameter = 0;
- parameterArg = 0;
+ paramArg = 0;
iCurArg += 1;
state = noparam;
/* We are the last arg so there
* cannot be a parameter to it. */
parameter = argChar;
- parameterArg = 0;
+ paramArg = 0;
iCurArg += 1;
argOffset = 0;
state = invalid;
else {
/* the parameter to the arg is the next arg. */
parameter = pSpecChar;
- parameterArg = argv[iCurArg + 1];
+ paramArg = argv[iCurArg + 1];
iCurArg += 2;
argOffset = 0;
state = match;
else {
/* The param for the arg is built in. */
parameter = pSpecChar;
- parameterArg = argOffset + 1;
+ paramArg = argOffset + 1;
iCurArg += 1;
argOffset = 0;
state = match;
/* Good, we matched the parm and no
* arg is required. */
parameter = pSpecChar;
- parameterArg = 0;
+ paramArg = 0;
argOffset += 1;
state = match;
return true;
/* We did not find a match. Bad Argument. */
parameter = argChar;
- parameterArg = 0;
+ paramArg = 0;
argOffset += 1;
state = invalid;
return true;
#undef GMCS
#ifdef _MSC_VER
-#define strcasecmp _stricmp
#define strtoll _strtoi64
#pragma warning( disable: 4244 4250 4355 4800 )
#endif
bool check();
- char *parameterArg; /* The argument to the parameter. */
+ char *paramArg; /* The argument to the parameter. */
char parameter; /* The parameter matched. */
enum { match, invalid, noparam } state;
.B \-s
Print some statistics on standard error.
.TP
+.B \--error-format=gnu
+Print error messages using the format "file:line:column:" (default)
+.TP
+.B \--error-format=msvc
+Print error messages using the format "file(line,column):"
+.TP
.B \-d
Do not remove duplicate actions from action lists.
.TP
" -d Do not remove duplicates from action lists\n"
" -I <dir> Add <dir> to the list of directories to search\n"
" for included an imported files\n"
+"error reporting format:\n"
+" --error-format=gnu file:line:column: message (default)\n"
+" --error-format=msvc file(line,column): message\n"
"fsm minimization:\n"
" -n Do not perform minimization\n"
" -m Minimize at the end of the compilation\n"
" -G2 Really fast goto-driven FSM\n"
" -P<N> N-Way Split really fast goto-driven FSM\n"
;
+
+ exit(0);
}
-/* Print version information. */
+/* Print version information and exit. */
void version()
{
cout << "Ragel State Machine Compiler version " VERSION << " " PUBDATE << endl <<
"Copyright (c) 2001-2007 by Adrian Thurston" << endl;
+ exit(0);
+}
+
+/* Error reporting format. */
+ErrorFormat errorFormat = ErrorFormatGNU;
+
+InputLoc makeInputLoc( const char *fileName, int line, int col)
+{
+ InputLoc loc = { fileName, line, col };
+ return loc;
+}
+
+ostream &operator<<( ostream &out, const InputLoc &loc )
+{
+ assert( loc.fileName != 0 );
+ switch ( errorFormat ) {
+ case ErrorFormatMSVC:
+ out << loc.fileName << "(" << loc.line;
+ if ( loc.col )
+ out << "," << loc.col;
+ out << ")";
+ break;
+
+ default:
+ out << loc.fileName << ":" << loc.line;
+ if ( loc.col )
+ out << ":" << loc.col;
+ break;
+ }
+ return out;
}
/* Total error count. */
/* Print the opening to a warning in the input, then return the error ostream. */
ostream &warning( const InputLoc &loc )
{
- assert( loc.fileName != 0 );
- cerr << loc.fileName << ":" << loc.line << ":" <<
- loc.col << ": warning: ";
+ cerr << loc << ": warning: ";
return cerr;
}
ostream &error( const InputLoc &loc )
{
gblErrorCount += 1;
- assert( loc.fileName != 0 );
- cerr << loc.fileName << ":" << loc.line << ": ";
+ cerr << loc << ": ";
return cerr;
}
/* Output. */
case 'o':
- if ( *pc.parameterArg == 0 )
+ if ( *pc.paramArg == 0 )
error() << "a zero length output file name was given" << endl;
else if ( outputFileName != 0 )
error() << "more than one output file name was given" << endl;
else {
/* Ok, remember the output file name. */
- outputFileName = pc.parameterArg;
+ outputFileName = pc.paramArg;
}
break;
/* Machine spec. */
case 'S':
- if ( *pc.parameterArg == 0 )
+ if ( *pc.paramArg == 0 )
error() << "please specify an argument to -S" << endl;
else if ( machineSpec != 0 )
error() << "more than one -S argument was given" << endl;
else {
/* Ok, remember the path to the machine to generate. */
- machineSpec = pc.parameterArg;
+ machineSpec = pc.paramArg;
frontendArgs.append( "-S" );
- frontendArgs.append( pc.parameterArg );
+ frontendArgs.append( pc.paramArg );
}
break;
/* Machine path. */
case 'M':
- if ( *pc.parameterArg == 0 )
+ if ( *pc.paramArg == 0 )
error() << "please specify an argument to -M" << endl;
else if ( machineName != 0 )
error() << "more than one -M argument was given" << endl;
else {
/* Ok, remember the machine name to generate. */
- machineName = pc.parameterArg;
+ machineName = pc.paramArg;
frontendArgs.append( "-M" );
- frontendArgs.append( pc.parameterArg );
+ frontendArgs.append( pc.paramArg );
}
break;
case 'I':
- if ( *pc.parameterArg == 0 )
+ if ( *pc.paramArg == 0 )
error() << "please specify an argument to -I" << endl;
else {
- includePaths.append( pc.parameterArg );
+ includePaths.append( pc.paramArg );
frontendArgs.append( "-I" );
- frontendArgs.append( pc.parameterArg );
+ frontendArgs.append( pc.paramArg );
}
break;
+ /* Error reporting format. */
+ case 'E':
+ if ( pc.paramArg[0] == '0' )
+ errorFormat = ErrorFormatGNU;
+ else if ( pc.paramArg[0] == '1' )
+ errorFormat = ErrorFormatMSVC;
+ else {
+ error() << "-E" << pc.paramArg[0] <<
+ " is an invalid argument" << endl;
+ }
+ frontendArgs.append( "-E" );
+ frontendArgs.append( pc.paramArg );
+ break;
+
/* Host language types. */
case 'C':
hostLang = &hostLangC;
/* Version and help. */
case 'v':
version();
- exit(0);
+ break;
case 'H': case 'h': case '?':
usage();
- exit(0);
+ break;
case 's':
printStatistics = true;
frontendArgs.append( "-s" );
break;
- case '-':
- if ( strcasecmp(pc.parameterArg, "help") == 0 ) {
+ case '-': {
+ char *eq = strchr( pc.paramArg, '=' );
+
+ if ( eq != 0 )
+ *eq++ = 0;
+
+ if ( strcmp( pc.paramArg, "help" ) == 0 )
usage();
- exit(0);
- }
- else if ( strcasecmp(pc.parameterArg, "version") == 0 ) {
+ else if ( strcmp( pc.paramArg, "version" ) == 0 )
version();
- exit(0);
+ else if ( strcmp( pc.paramArg, "error-format" ) == 0 ) {
+ if ( eq == 0 )
+ error() << "expecting '=value' for error-format" << endl;
+ else if ( strcmp( eq, "gnu" ) == 0 ) {
+ errorFormat = ErrorFormatGNU;
+ frontendArgs.append( "--error-format=gnu" );
+ }
+ else if ( strcmp( eq, "msvc" ) == 0 ) {
+ errorFormat = ErrorFormatMSVC;
+ frontendArgs.append( "--error-format=msvc" );
+ }
+ else {
+ error() << "invalid value for error-format" << endl;
+ }
}
else {
- error() << "--" << pc.parameterArg <<
+ error() << "--" << pc.paramArg <<
" is an invalid argument" << endl;
}
+ }
/* Passthrough args. */
case 'T':
backendArgs.append( "-T" );
- backendArgs.append( pc.parameterArg );
+ backendArgs.append( pc.paramArg );
break;
case 'F':
backendArgs.append( "-F" );
- backendArgs.append( pc.parameterArg );
+ backendArgs.append( pc.paramArg );
break;
case 'G':
backendArgs.append( "-G" );
- backendArgs.append( pc.parameterArg );
+ backendArgs.append( pc.paramArg );
break;
case 'P':
backendArgs.append( "-P" );
- backendArgs.append( pc.parameterArg );
+ backendArgs.append( pc.paramArg );
break;
case 'p':
backendArgs.append( "-p" );
extern bool printStatistics;
extern bool wantDupsRemoved;
+/* Error reporting format. */
+enum ErrorFormat {
+ ErrorFormatGNU,
+ ErrorFormatMSVC,
+};
+
+extern ErrorFormat errorFormat;
extern int gblErrorCount;
extern char mainMachine[];
int col;
};
+InputLoc makeInputLoc( const char *fileName, int line = 0, int col = 0 );
+std::ostream &operator<<( std::ostream &out, const InputLoc &loc );
+
/* Error reporting. */
std::ostream &error();
std::ostream &error( const InputLoc &loc );
/* Maintain the error count. */
gblErrorCount += 1;
- cerr << token.loc.fileName << ":" << token.loc.line << ":" << token.loc.col << ": ";
+ cerr << token.loc << ": ";
cerr << "at token ";
if ( tokId < 128 )
cerr << "\"" << Parser_lelNames[tokId] << "\"";
{
/* Maintain the error count. */
gblErrorCount += 1;
- cerr << fileName << ":" << line << ":" << column << ": ";
+ cerr << makeInputLoc( fileName, line, column ) << ": ";
return cerr;
}
switch ( pc.parameter ) {
/* Output. */
case 'o':
- if ( *pc.parameterArg == 0 )
+ if ( *pc.paramArg == 0 )
error() << "a zero length output file name was given" << endl;
else if ( outputFileName != 0 )
error() << "more than one output file name was given" << endl;
else {
/* Ok, remember the output file name. */
- outputFileName = pc.parameterArg;
+ outputFileName = pc.paramArg;
}
break;
/* Code style. */
case 'T':
- if ( pc.parameterArg[0] == '0' )
+ if ( pc.paramArg[0] == '0' )
codeStyle = GenTables;
- else if ( pc.parameterArg[0] == '1' )
+ else if ( pc.paramArg[0] == '1' )
codeStyle = GenFTables;
else {
- error() << "-T" << pc.parameterArg[0] <<
+ error() << "-T" << pc.paramArg[0] <<
" is an invalid argument" << endl;
exit(1);
}
break;
case 'F':
- if ( pc.parameterArg[0] == '0' )
+ if ( pc.paramArg[0] == '0' )
codeStyle = GenFlat;
- else if ( pc.parameterArg[0] == '1' )
+ else if ( pc.paramArg[0] == '1' )
codeStyle = GenFFlat;
else {
- error() << "-F" << pc.parameterArg[0] <<
+ error() << "-F" << pc.paramArg[0] <<
" is an invalid argument" << endl;
exit(1);
}
break;
case 'G':
- if ( pc.parameterArg[0] == '0' )
+ if ( pc.paramArg[0] == '0' )
codeStyle = GenGoto;
- else if ( pc.parameterArg[0] == '1' )
+ else if ( pc.paramArg[0] == '1' )
codeStyle = GenFGoto;
- else if ( pc.parameterArg[0] == '2' )
+ else if ( pc.paramArg[0] == '2' )
codeStyle = GenIpGoto;
else {
- error() << "-G" << pc.parameterArg[0] <<
+ error() << "-G" << pc.paramArg[0] <<
" is an invalid argument" << endl;
exit(1);
}
break;
case 'P':
codeStyle = GenSplit;
- numSplitPartitions = atoi( pc.parameterArg );
+ numSplitPartitions = atoi( pc.paramArg );
break;
/* Version and help. */
usage();
exit(0);
case '-':
- if ( strcasecmp(pc.parameterArg, "help") == 0 ) {
+ if ( strcmp(pc.paramArg, "help") == 0 ) {
usage();
exit(0);
}
- else if ( strcasecmp(pc.parameterArg, "version") == 0 ) {
+ else if ( strcmp(pc.paramArg, "version") == 0 ) {
version();
exit(0);
}
else {
- error() << "--" << pc.parameterArg <<
+ error() << "--" << pc.paramArg <<
" is an invalid argument" << endl;
break;
}
switch ( pc.parameter ) {
/* Output. */
case 'o':
- if ( *pc.parameterArg == 0 )
+ if ( *pc.paramArg == 0 )
error() << "a zero length output file name was given" << endl;
else if ( outputFileName != 0 )
error() << "more than one output file name was given" << endl;
else {
/* Ok, remember the output file name. */
- outputFileName = pc.parameterArg;
+ outputFileName = pc.paramArg;
}
break;
/* Code style. */
case 'T':
- if ( pc.parameterArg[0] == '0' )
+ if ( pc.paramArg[0] == '0' )
codeStyle = GenTables;
- else if ( pc.parameterArg[0] == '1' )
+ else if ( pc.paramArg[0] == '1' )
codeStyle = GenFTables;
else {
- error() << "-T" << pc.parameterArg[0] <<
+ error() << "-T" << pc.paramArg[0] <<
" is an invalid argument" << endl;
exit(1);
}
break;
case 'F':
- if ( pc.parameterArg[0] == '0' )
+ if ( pc.paramArg[0] == '0' )
codeStyle = GenFlat;
- else if ( pc.parameterArg[0] == '1' )
+ else if ( pc.paramArg[0] == '1' )
codeStyle = GenFFlat;
else {
- error() << "-F" << pc.parameterArg[0] <<
+ error() << "-F" << pc.paramArg[0] <<
" is an invalid argument" << endl;
exit(1);
}
break;
case 'G':
- if ( pc.parameterArg[0] == '0' )
+ if ( pc.paramArg[0] == '0' )
codeStyle = GenGoto;
- else if ( pc.parameterArg[0] == '1' )
+ else if ( pc.paramArg[0] == '1' )
codeStyle = GenFGoto;
- else if ( pc.parameterArg[0] == '2' )
+ else if ( pc.paramArg[0] == '2' )
codeStyle = GenIpGoto;
else {
- error() << "-G" << pc.parameterArg[0] <<
+ error() << "-G" << pc.paramArg[0] <<
" is an invalid argument" << endl;
exit(1);
}
break;
case 'P':
codeStyle = GenSplit;
- numSplitPartitions = atoi( pc.parameterArg );
+ numSplitPartitions = atoi( pc.paramArg );
break;
/* Version and help. */
usage();
exit(0);
case '-':
- if ( strcasecmp(pc.parameterArg, "help") == 0 ) {
+ if ( strcmp(pc.paramArg, "help") == 0 ) {
usage();
exit(0);
}
- else if ( strcasecmp(pc.parameterArg, "version") == 0 ) {
+ else if ( strcmp(pc.paramArg, "version") == 0 ) {
version();
exit(0);
}
else {
- error() << "--" << pc.parameterArg <<
+ error() << "--" << pc.paramArg <<
" is an invalid argument" << endl;
break;
}
switch ( pc.parameter ) {
/* Output. */
case 'o':
- if ( *pc.parameterArg == 0 )
+ if ( *pc.paramArg == 0 )
error() << "a zero length output file name was given" << endl;
else if ( outputFileName != 0 )
error() << "more than one output file name was given" << endl;
else {
/* Ok, remember the output file name. */
- outputFileName = pc.parameterArg;
+ outputFileName = pc.paramArg;
}
break;
usage();
exit(0);
case '-':
- if ( strcasecmp(pc.parameterArg, "help") == 0 ) {
+ if ( strcmp(pc.paramArg, "help") == 0 ) {
usage();
exit(0);
}
- else if ( strcasecmp(pc.parameterArg, "version") == 0 ) {
+ else if ( strcmp(pc.paramArg, "version") == 0 ) {
version();
exit(0);
}
else {
- error() << "--" << pc.parameterArg <<
+ error() << "--" << pc.paramArg <<
" is an invalid argument" << endl;
break;
}
switch ( pc.parameter ) {
/* Output. */
case 'o':
- if ( *pc.parameterArg == 0 )
+ if ( *pc.paramArg == 0 )
error() << "a zero length output file name was given" << endl;
else if ( outputFileName != 0 )
error() << "more than one output file name was given" << endl;
else {
/* Ok, remember the output file name. */
- outputFileName = pc.parameterArg;
+ outputFileName = pc.paramArg;
}
break;
usage();
exit(0);
case '-':
- if ( strcasecmp(pc.parameterArg, "help") == 0 ) {
+ if ( strcmp(pc.paramArg, "help") == 0 ) {
usage();
exit(0);
}
- else if ( strcasecmp(pc.parameterArg, "version") == 0 ) {
+ else if ( strcmp(pc.paramArg, "version") == 0 ) {
version();
exit(0);
}
else {
- error() << "--" << pc.parameterArg <<
+ error() << "--" << pc.paramArg <<
" is an invalid argument" << endl;
break;
}
switch ( pc.parameter ) {
/* Output. */
case 'o':
- if ( *pc.parameterArg == 0 )
+ if ( *pc.paramArg == 0 )
error() << "a zero length output file name was given" << endl;
else if ( outputFileName != 0 )
error() << "more than one output file name was given" << endl;
else {
/* Ok, remember the output file name. */
- outputFileName = pc.parameterArg;
+ outputFileName = pc.paramArg;
}
break;
/* Code style. */
case 'T':
- if ( pc.parameterArg[0] == '0' )
+ if ( pc.paramArg[0] == '0' )
codeStyle = GenTables;
- else if ( pc.parameterArg[0] == '1' )
+ else if ( pc.paramArg[0] == '1' )
codeStyle = GenFTables;
else {
- error() << "-T" << pc.parameterArg[0] <<
+ error() << "-T" << pc.paramArg[0] <<
" is an invalid argument" << endl;
exit(1);
}
break;
case 'F':
- if ( pc.parameterArg[0] == '0' )
+ if ( pc.paramArg[0] == '0' )
codeStyle = GenFlat;
- else if ( pc.parameterArg[0] == '1' )
+ else if ( pc.paramArg[0] == '1' )
codeStyle = GenFFlat;
else {
- error() << "-F" << pc.parameterArg[0] <<
+ error() << "-F" << pc.paramArg[0] <<
" is an invalid argument" << endl;
exit(1);
}
break;
case 'G':
- if ( pc.parameterArg[0] == '0' )
+ if ( pc.paramArg[0] == '0' )
codeStyle = GenGoto;
- else if ( pc.parameterArg[0] == '1' )
+ else if ( pc.paramArg[0] == '1' )
codeStyle = GenFGoto;
- else if ( pc.parameterArg[0] == '2' )
+ else if ( pc.paramArg[0] == '2' )
codeStyle = GenIpGoto;
else {
- error() << "-G" << pc.parameterArg[0] <<
+ error() << "-G" << pc.paramArg[0] <<
" is an invalid argument" << endl;
exit(1);
}
break;
case 'P':
codeStyle = GenSplit;
- numSplitPartitions = atoi( pc.parameterArg );
+ numSplitPartitions = atoi( pc.paramArg );
break;
case 'x':
exit(0);
case '-':
- if ( strcasecmp(pc.parameterArg, "help") == 0 ) {
+ if ( strcmp(pc.paramArg, "help") == 0 ) {
usage();
exit(0);
}
- else if ( strcasecmp(pc.parameterArg, "version") == 0 ) {
+ else if ( strcmp(pc.paramArg, "version") == 0 ) {
version();
exit(0);
}
- else if ( strcasecmp(pc.parameterArg, "rbx") == 0 ) {
- rubyImpl = Rubinius;
- }
+ else if ( strcmp(pc.paramArg, "rbx") == 0 ) {
+ rubyImpl = Rubinius;
+ }
else {
- error() << "--" << pc.parameterArg <<
+ error() << "--" << pc.paramArg <<
" is an invalid argument" << endl;
break;
}