mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-26 12:53:13 +00:00
AST no templates
This commit is contained in:
parent
3e3eefc2dc
commit
4f8d4f378c
5 changed files with 133 additions and 5 deletions
|
@ -152,6 +152,7 @@
|
|||
D0F019FD15A977CA0034B3B1 /* config.fish in CopyFiles */ = {isa = PBXBuildFile; fileRef = D0C4FD9415A7D7EE00212EF1 /* config.fish */; };
|
||||
D0F01A0315A978910034B3B1 /* osx_fish_launcher.m in Sources */ = {isa = PBXBuildFile; fileRef = D0D02AFA159871B2008E62BD /* osx_fish_launcher.m */; };
|
||||
D0F01A0515A978A10034B3B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0CBD583159EEE010024809C /* Foundation.framework */; };
|
||||
D0FE8EE8179FB760008C9F21 /* parse_productions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0FE8EE7179FB75F008C9F21 /* parse_productions.cpp */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
|
@ -465,7 +466,8 @@
|
|||
D0D2693C159835CA005D9B9C /* fish */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fish; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0F3373A1506DE3C00ECEFC0 /* builtin_test.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = builtin_test.cpp; sourceTree = "<group>"; };
|
||||
D0F5E28415A7A32D00315DFF /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
|
||||
D0FE8EE6179CA8A5008C9F21 /* parse_tree_construction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parse_tree_construction.h; sourceTree = "<group>"; };
|
||||
D0FE8EE6179CA8A5008C9F21 /* parse_productions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parse_productions.h; sourceTree = "<group>"; };
|
||||
D0FE8EE7179FB75F008C9F21 /* parse_productions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parse_productions.cpp; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
@ -589,8 +591,9 @@
|
|||
D0A0853C13B3ACEE0099B651 /* exec.cpp */,
|
||||
D0A0850C13B3ACEE0099B651 /* expand.h */,
|
||||
D0A0853D13B3ACEE0099B651 /* expand.cpp */,
|
||||
D0FE8EE6179CA8A5008C9F21 /* parse_productions.h */,
|
||||
D0FE8EE7179FB75F008C9F21 /* parse_productions.cpp */,
|
||||
D0C52F361765284C00BFAB82 /* parse_tree.h */,
|
||||
D0FE8EE6179CA8A5008C9F21 /* parse_tree_construction.h */,
|
||||
D0C52F351765284C00BFAB82 /* parse_tree.cpp */,
|
||||
D0C52F341765281F00BFAB82 /* parse_exec.h */,
|
||||
D0C52F331765281F00BFAB82 /* parse_exec.cpp */,
|
||||
|
@ -1116,6 +1119,7 @@
|
|||
D0D02A89159839DF008E62BD /* fish.cpp in Sources */,
|
||||
D0C52F371765284C00BFAB82 /* parse_tree.cpp in Sources */,
|
||||
D0C52F381765720600BFAB82 /* parse_exec.cpp in Sources */,
|
||||
D0FE8EE8179FB760008C9F21 /* parse_productions.cpp in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
|
63
parse_productions.cpp
Normal file
63
parse_productions.cpp
Normal file
|
@ -0,0 +1,63 @@
|
|||
#include "parse_productions.h"
|
||||
|
||||
using namespace parse_productions;
|
||||
|
||||
#define PRODUCTIONS(sym) static const Production_t sym##_productions
|
||||
|
||||
PRODUCTIONS(job_list) =
|
||||
{
|
||||
{},
|
||||
{symbol_job, symbol_job_list},
|
||||
{parse_token_type_end, symbol_job_list}
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* A job_list is a list of jobs, separated by semicolons or newlines */
|
||||
|
||||
DEC(job_list) {
|
||||
symbol_job_list,
|
||||
{
|
||||
{},
|
||||
{symbol_job, symbol_job_list},
|
||||
{parse_token_type_end, symbol_job_list}
|
||||
},
|
||||
resolve_job_list
|
||||
};
|
||||
|
||||
static int resolve_job_list(parse_token_type_t token_type, parse_keyword_t token_keyword)
|
||||
{
|
||||
switch (token_type)
|
||||
{
|
||||
case parse_token_type_string:
|
||||
// 'end' is special
|
||||
switch (token_keyword)
|
||||
{
|
||||
case parse_keyword_end:
|
||||
case parse_keyword_else:
|
||||
// End this job list
|
||||
return 0;
|
||||
|
||||
default:
|
||||
// Normal string
|
||||
return 1;
|
||||
}
|
||||
|
||||
case parse_token_type_pipe:
|
||||
case parse_token_type_redirection:
|
||||
case parse_token_type_background:
|
||||
return 1;
|
||||
|
||||
case parse_token_type_end:
|
||||
// Empty line
|
||||
return 2;
|
||||
|
||||
case parse_token_type_terminate:
|
||||
// no more commands, just transition to empty
|
||||
return 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
return NO_PRODUCTION;
|
||||
}
|
||||
}
|
|
@ -10,6 +10,67 @@
|
|||
|
||||
/* Terrifying template black magic. */
|
||||
|
||||
/*
|
||||
|
||||
- Get info for symbol
|
||||
- Resolve production from info
|
||||
- Get productions for children
|
||||
- Get symbols for productions
|
||||
|
||||
Production may be:
|
||||
|
||||
1. Single value
|
||||
2. Sequence of values (possibly empty)
|
||||
3. Options of Single / Sequence
|
||||
|
||||
Info to specify:
|
||||
|
||||
1. Number of different productions
|
||||
2. Resolver function
|
||||
3. Symbols for associated productions
|
||||
|
||||
Choice: should info be a class or a data?
|
||||
|
||||
data:
|
||||
|
||||
struct Symbol_t
|
||||
{
|
||||
enum parse_token_type_t token_type;
|
||||
int (*resolver)(parse_token_type_t tok, parse_keyword_t key); //may be trivial
|
||||
production productions[5];
|
||||
}
|
||||
|
||||
struct Production_t
|
||||
{
|
||||
enum parse_token_type_t symbols[5];
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
namespace parse_productions
|
||||
{
|
||||
|
||||
#define MAX_PRODUCTIONS 5
|
||||
#define MAX_SYMBOLS_PER_PRODUCTION 5
|
||||
|
||||
|
||||
|
||||
struct Production_t
|
||||
{
|
||||
enum parse_token_type_t symbols[MAX_SYMBOLS_PER_PRODUCTION];
|
||||
};
|
||||
|
||||
struct Symbol_t
|
||||
{
|
||||
enum parse_token_type_t token_type;
|
||||
int (*resolver)(parse_token_type_t tok, parse_keyword_t key);
|
||||
Production_t productions[MAX_PRODUCTIONS];
|
||||
};
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
namespace parse_symbols
|
||||
{
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
#include "parse_tree_construction.h"
|
||||
#include "parse_productions.h"
|
||||
#include "tokenizer.h"
|
||||
#include <vector>
|
||||
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
Programmatic representation of fish code.
|
||||
*/
|
||||
|
||||
#ifndef FISH_PARSE_TREE_H
|
||||
#define FISH_PARSE_TREE_H
|
||||
#ifndef FISH_PARSE_PRODUCTIONS_H
|
||||
#define FISH_PARSE_PRODUCTIONS_H
|
||||
|
||||
#include <wchar.h>
|
||||
|
||||
|
|
Loading…
Reference in a new issue