Skip to content

Commit

Permalink
Использование GetOpt в утилите srmake (#26)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mazdaywik committed Apr 17, 2016
1 parent af0ec09 commit c4029fe
Show file tree
Hide file tree
Showing 4 changed files with 199 additions and 181 deletions.
27 changes: 27 additions & 0 deletions src/common/GetOpt-CheckRepeated.sref
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
<GetOpt-CheckRepeated (e.UniqueTags) (e.Errors) e.Options>
== (e.Errors) e.Options
*/
$ENTRY GetOpt-CheckRepeated {
// Разрешаем повторять опции с одинаковым значением
(e.CheckedTags-B s.Tag e.CheckedTags-E)
(e.Errors)
e.Opts-B (s.Tag s.Num1 e.Value) e.Opts-M (s.Tag s.Num2 e.Value) e.Opts-E =
<GetOpt-CheckRepeated
(e.CheckedTags-B s.Tag e.CheckedTags-E)
(e.Errors)
e.Opts-B (s.Tag s.Num1 e.Value) e.Opts-M e.Opts-E
>;

(e.CheckedTags-B s.Tag e.CheckedTags-E)
(e.Errors)
e.Opts-B (s.Tag s.Num1 e.Value1) e.Opts-M (s.Tag s.Num2 e.Value2) e.Opts-E =
<GetOpt-CheckRepeated
(e.CheckedTags-B s.Tag e.CheckedTags-E)
(e.Errors (s.Num2 #RepeatOption s.Tag))
e.Opts-B (s.Tag s.Num1 e.Value1) e.Opts-M e.Opts-E
>;

(e.CheckedTags) (e.Errors) e.Options =
(e.Errors) e.Options;
}
29 changes: 4 additions & 25 deletions src/compiler/ParseCmdLine.sref
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
//FROM GetOpt
$EXTERN GetOpt;

//FROM GetOpt-CheckRepeated
$EXTERN GetOpt-CheckRepeated;

//FROM LibraryEx
$EXTERN Fetch, Seq, MapReduce, Map;

Expand Down Expand Up @@ -34,7 +37,7 @@ $ENTRY ParseCommandLine {
<Seq
{
(e.Errors) e.Options =
<CheckRepeated
<GetOpt-CheckRepeated
(#CppCompiler #GenMode #Opt #ErrorFile) (e.Errors) e.Options
>;
}
Expand Down Expand Up @@ -205,27 +208,3 @@ $ENTRY ParseCommandLine {
>
>;
}

CheckRepeated {
// Разрешаем повторять опции с одинаковым значением
(e.CheckedTags-B s.Tag e.CheckedTags-E)
(e.Errors)
e.Opts-B (s.Tag s.Num1 e.Value) e.Opts-M (s.Tag s.Num2 e.Value) e.Opts-E =
<CheckRepeated
(e.CheckedTags-B s.Tag e.CheckedTags-E)
(e.Errors)
e.Opts-B (s.Tag s.Num1 e.Value) e.Opts-M e.Opts-E
>;

(e.CheckedTags-B s.Tag e.CheckedTags-E)
(e.Errors)
e.Opts-B (s.Tag s.Num1 e.Value1) e.Opts-M (s.Tag s.Num2 e.Value2) e.Opts-E =
<CheckRepeated
(e.CheckedTags-B s.Tag e.CheckedTags-E)
(e.Errors (s.Num2 #RepeatOption s.Tag))
e.Opts-B (s.Tag s.Num1 e.Value1) e.Opts-M e.Opts-E
>;

(e.CheckedTags) (e.Errors) e.Options =
(e.Errors) e.Options;
}
214 changes: 123 additions & 91 deletions src/srmake/ParseCmdLine.sref
Original file line number Diff line number Diff line change
@@ -1,99 +1,131 @@
//FROM GetOpt
$EXTERN GetOpt;

//FROM GetOpt-CheckRepeated
$EXTERN GetOpt-CheckRepeated;

//FROM LibraryEx
$EXTERN Fetch, Seq, MapReduce, Map;

/**
<ParseCommandLine e.Arguments>
== t.Compiler (e.Folders) t.FoundedFile*
== (#CmdLineError e.Message)
== #Success
(e.CppCompiler) (e.SrefCompiler) (e.FileName) (e.Flags) e.Folders
== #Fails (s.ArgNum e.Message)*

t.FoundedFile -- см. в FindFile
t.Compiler ::= (#NoCompile) | (#CompileCommand e.Command)
e.Folders ::= (s.FolderType e.Path)*
s.FolderType ::= #Search | #Runtime
*/
$ENTRY ParseCommandLine {
e.Arguments =
<DoParseCommandLine (/* files */) (/* folders */) e.Arguments>;
}

DoParseCommandLine {
(e.ScannedFiles) (e.Folders) ('-c') (e.CompileCommand) e.Files =
<DoParseFileNames
(#CompileCommand e.CompileCommand) (e.ScannedFiles) (e.Folders) e.Files
>;

(e.ScannedFiles) (e.Folders) ('-c') =
(#CmdLineError 'After option ''-c'' expected C++ compiler command line');

(e.ScannedFiles) (e.Folders) ('-d') (e.Directory) e.Options =
<DoParseCommandLine
(e.ScannedFiles) (e.Folders (#Search e.Directory)) e.Options
>;

(e.ScannedFiles) (e.Folders) ('-d') =
(#CmdLineError 'After option ''-d'' expected find directory');

(e.ScannedFiles) (e.Folders) ('-D') (e.Directory) e.Options =
<DoParseCommandLine
(e.ScannedFiles) (e.Folders (#Runtime e.Directory)) e.Options
>;

(e.ScannedFiles) (e.Folders) ('-D') =
(#CmdLineError 'After option ''-d'' expected find directory');

(e.ScannedFiles) (e.Folders) ('--') e.Options =
<DoParseFileNamesOnly
(#NoCompile) (e.ScannedFiles) (e.Folders) e.Options
>;

(e.ScannedFiles) (e.Folders) (e.NextFileName) e.Options =
<DoParseCommandLine
(e.ScannedFiles (e.NextFileName)) (e.Folders) e.Options
>;

(e.ScannedFiles) (e.Folders) = (#NoCompile) (e.Folders) e.ScannedFiles;
}

DoParseFileNames {
t.Compiler (e.ScannedFiles) (e.Folders) ('-c') (e.CompileCommand) e.Options =
(#CmdLineError 'Multiple declaration of C++ compiler command line');

t.Compiler (e.ScannedFiles) (e.Folders) ('-c') =
(#CmdLineError 'After option ''-c'' expected C++ compiler command line');

t.Compiler (e.ScannedFiles) (e.Folders) ('-d') (e.Directory) e.Options =
<DoParseFileNames
t.Compiler (e.ScannedFiles) (e.Folders (#Search e.Directory)) e.Options
>;

t.Compiler (e.ScannedFiles) (e.Folders) ('-d') =
(#CmdLineError 'After option ''-d'' expected find directory');

t.Compiler (e.ScannedFiles) (e.Folders) ('-D') (e.Directory) e.Options =
<DoParseFileNames
t.Compiler (e.ScannedFiles) (e.Folders (#Runtime e.Directory)) e.Options
>;

t.Compiler (e.ScannedFiles) (e.Folders) ('-D') =
(#CmdLineError 'After option ''-d'' expected find directory');

t.Compiler (e.ScannedFiles) (e.Folders) ('--') e.Files =
<DoParseFileNamesOnly
t.Compiler (e.ScannedFiles) (e.Folders) e.Files
>;

t.Compiler (e.ScannedFiles) (e.Folders) (e.NextFileName) e.Options =
<DoParseFileNames
t.Compiler (e.ScannedFiles (e.NextFileName)) (e.Folders) e.Options
<Fetch
<GetOpt
(
(#CppCompiler #Required 'c' ('cpp-command'))
(#SrefCompiler #Required 's' ('sref-command'))
(#SearchFolder #Required 'd' ('dir') ('directory'))
(#RuntimeFolder #Required 'D' ('runtime-dir') ('runtime-directory'))
(#CompilerOption #Required 'X' ('thru') ('through'))
)
e.Arguments
>
<Seq
{
(e.Errors) e.Options =
<GetOpt-CheckRepeated
(#CppCompiler #SrefCompiler #FILE) (e.Errors) e.Options
>;
}
{
(e.Errors) e.Options-B (#CppCompiler s.Num e.Command) e.Options-E =
(e.Errors) ((e.Command)) e.Options-B e.Options-E;

(e.Errors) e.Options =
(e.Errors (1 #NoCppCompiler)) (()) e.Options;
}
{
(e.Errors) (e.Bag)
e.Options-B (#SrefCompiler s.Num e.Command) e.Options-E =
(e.Errors) (e.Bag (e.Command)) e.Options-B e.Options-E;

(e.Errors) (e.Bag) e.Options =
(e.Errors) (e.Bag ('srefc-core')) e.Options;
}
{
(e.Errors) (e.Bag)
e.Options-B (#FILE s.Num e.FileName) e.Options-E =
(e.Errors) (e.Bag (e.FileName)) e.Options-B e.Options-E;

(e.Errors) (e.Bag) e.Options =
(e.Errors (1 #NoSourceFile)) (e.Bag ()) e.Options;
}
{
(e.Errors) (e.Bag) e.Options =
(e.Errors)
<MapReduce
{
((e.CppCompiler) (e.SrefCompiler) e.Bag^)
(#CompilerOption s.Num e.Flag) =
((e.CppCompiler) (e.SrefCompiler ' "' e.Flag '"') e.Bag);

(e.Bag^) t.OtherOption = (e.Bag) t.OtherOption;
}
(e.Bag) e.Options
>;
}
{
(e.Errors) (e.Bag) e.Options =
(e.Errors) (e.Bag)
<Map
{
(#SearchFolder s.Num e.Folder) = (#Search e.Folder);
(#RuntimeFolder s.Num e.Folder) = (#Runtime e.Folder);
}
e.Options
>;
}
{
() ((e.CppCompiler) (e.SrefCompiler) (e.MainSource)) e.Folders =
#Success (e.CppCompiler) (e.SrefCompiler) (e.MainSource) e.Folders;

(e.Errors) (e.Bag) e.Folders =
#Fails
<Map
{
(s.Pos #NoRequiredParam e.Param) =
(s.Pos 'option ' e.Param ' expects parameter');

(s.Pos #UnknownShortOption s.Option) =
(s.Pos 'unknown option -' s.Option);

(s.Pos #UnknownLongOption e.Option) =
(s.Pos 'unknown option --' e.Option);

// У нас все опции с параметрами, не должно возникать
// (s.Pos #UnexpectedLongOptionParam (e.Option) e.Param) =

(s.Pos #RepeatOption s.Tag) =
(
s.Pos
<Fetch
s.Tag {
#CppCompiler = 'option -c or --cpp-command';
#SrefCompiler = 'option -s or --sref-command';
#FILE = 'source filename';
}
>
' must appear one time'
);

(s.Pos #NoCppCompiler) =
(s.Pos 'option -c or --cpp-command not found');

(s.Pos #NoSourceFile) =
(s.Pos 'expected source filename in command line');
}
e.Errors
>;
}
>
>;

t.Compiler (e.ScannedFiles) (e.Folders) =
t.Compiler (e.Folders) e.ScannedFiles;
}

DoParseFileNamesOnly {
t.Compiler (e.ScannedFiles) (e.Folders) (e.NextFileName) e.Files =
<DoParseFileNamesOnly
t.Compiler
(e.ScannedFiles (e.NextFileName)) e.Files
>;

t.Compiler (e.ScannedFiles) (e.Folders) =
t.Compiler (e.Folders) e.ScannedFiles;
}

Loading

0 comments on commit c4029fe

Please sign in to comment.