Initial work on parser bringup (squash)

This commit is contained in:
ridiculousfish
2013-05-26 12:12:16 -07:00
parent 908b07527e
commit 54f683fc6b
3 changed files with 121 additions and 3 deletions

9
expression.cpp Normal file
View File

@@ -0,0 +1,9 @@
//
// expression.cpp
// fish
//
// Created by Peter Ammon on 5/25/13.
//
//
#include "expression.h"

103
expression.h Normal file
View File

@@ -0,0 +1,103 @@
/**\file expression.h
Programmatic representation of fish code.
*/
#ifndef FISH_EXPRESSION_H
#define FISH_EXPRESSION_H
#include <wchar.h>
#include "config.h"
#include "util.h"
#include "common.h"
/* Fish grammar:
# A statement_list is a list of statements, separated by semicolons or newlines
statement_list = <empty> | statement | statement statement_list
# A statement is a normal job, or an if / while / and etc.
statement = boolean_statement | block_statement | decorated_statement
# A block is a conditional, loop, or begin/end
block_statement = block_header statement_list END arguments_or_redirections_list
block_header = if_header | for_header | while_header | function_header | begin_header
if_header = IF statement
for_header = FOR var_name IN arguments_or_redirections_list STATEMENT_TERMINATOR
while_header = WHILE statement
begin_header = BEGIN STATEMENT_TERMINATOR
function_header = FUNCTION arguments_or_redirections_list STATEMENT_TERMINATOR
# A boolean statement is AND or OR or NOT
boolean_statement = AND statement | OR statement | NOT statement
# A decorated_statement is a command with a list of arguments_or_redirections, possibly with "builtin" or "command"
decorated_statement = COMMAND plain_statement | BUILTIN plain_statement | plain_statement
plain_statement = command arguments_or_redirections_list terminator
arguments_or_redirections_list = <empty> | argument_or_redirection
argument_or_redirection = redirection | <STRING>
redirection = REDIRECTION
*/
class parse_command_t;
/** Root of a parse tree */
class parse_tree_t
{
/** Literal source code */
wcstring source;
/** Initial node */
parse_command_list_t *child;
};
/** Base class for nodes of a parse tree */
class parse_node_base_t
{
/* Backreference to the tree */
parse_tree_t * const tree;
/* Start in the source code */
const unsigned int source_start;
/* Length of our range in the source code */
const unsigned int source_length;
};
class parse_statement_list_t : public parse_node_base_t
{
std::vector<parse_statement_t *> statements;
};
class parse_statement_t : public parse_node_base_t
{
};
class parse_boolean_statement_t : public parse_statement_t
{
};
class parse_plain_statement_t : public parse_statement_t
{
};
class parse_block_statement_t : public parse_statement_t
{
};
#endif

View File

@@ -72,6 +72,7 @@
D07D266D15E33B86009E43F6 /* functions in Copy Files */ = {isa = PBXBuildFile; fileRef = D025C02815D1FEA100B9DB63 /* functions */; };
D07D266E15E33B86009E43F6 /* tools in Copy Files */ = {isa = PBXBuildFile; fileRef = D025C02915D1FEA100B9DB63 /* tools */; };
D07D267215E34171009E43F6 /* config.fish in Copy Files */ = {isa = PBXBuildFile; fileRef = D0CBD580159EE48F0024809C /* config.fish */; };
D07FEA311751E6AF003066C3 /* expression.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D07FEA2F1751E6AF003066C3 /* expression.cpp */; };
D0879AC816BF9AAB00E98E56 /* fish_term_icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = D0879AC616BF9A1A00E98E56 /* fish_term_icon.icns */; };
D0A564FE168D23D800AF6161 /* man in CopyFiles */ = {isa = PBXBuildFile; fileRef = D0A564F1168D0BAB00AF6161 /* man */; };
D0A56501168D258300AF6161 /* man in Copy Files */ = {isa = PBXBuildFile; fileRef = D0A564F1168D0BAB00AF6161 /* man */; };
@@ -336,6 +337,8 @@
D03EE83814DF88B200FC7150 /* lru.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lru.h; sourceTree = "<group>"; };
D07B247215BCC15700D4ADB4 /* add-shell */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "add-shell"; path = "build_tools/osx_package_scripts/add-shell"; sourceTree = "<group>"; };
D07B247515BCC4BE00D4ADB4 /* install.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = install.sh; path = osx/install.sh; sourceTree = "<group>"; };
D07FEA2F1751E6AF003066C3 /* expression.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = expression.cpp; sourceTree = "<group>"; };
D07FEA301751E6AF003066C3 /* expression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = expression.h; sourceTree = "<group>"; };
D0879AC616BF9A1A00E98E56 /* fish_term_icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = fish_term_icon.icns; path = osx/fish_term_icon.icns; sourceTree = "<group>"; };
D09B1C1914FC7B5B00F91077 /* postfork.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = postfork.cpp; sourceTree = "<group>"; };
D09B1C1A14FC7B5B00F91077 /* postfork.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = postfork.h; sourceTree = "<group>"; };
@@ -582,6 +585,8 @@
D0A0853C13B3ACEE0099B651 /* exec.cpp */,
D0A0850C13B3ACEE0099B651 /* expand.h */,
D0A0853D13B3ACEE0099B651 /* expand.cpp */,
D07FEA301751E6AF003066C3 /* expression.h */,
D07FEA2F1751E6AF003066C3 /* expression.cpp */,
D0A0850D13B3ACEE0099B651 /* fallback.h */,
D0A0853E13B3ACEE0099B651 /* fallback.cpp */,
D0A0850E13B3ACEE0099B651 /* function.h */,
@@ -1102,6 +1107,7 @@
D0D02A7A15983916008E62BD /* env_universal.cpp in Sources */,
D0D02A7B15983928008E62BD /* env_universal_common.cpp in Sources */,
D0D02A89159839DF008E62BD /* fish.cpp in Sources */,
D07FEA311751E6AF003066C3 /* expression.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1189,7 +1195,7 @@
"PREFIX=L\\\"/usr/local\\\"",
"DATADIR=L\\\"/usr/local/share\\\"",
"SYSCONFDIR=L\\\"/usr/local/etc\\\"",
"BINDIR=L\\\"/usr/local/bin\\\"",
"BINDIR=L\\\"/usr/local/bin\\\"",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
@@ -1339,7 +1345,7 @@
"PREFIX=L\\\"/usr/local\\\"",
"DATADIR=L\\\"/usr/local/share\\\"",
"SYSCONFDIR=L\\\"/usr/local/etc\\\"",
"BINDIR=L\\\"/usr/local/bin\\\"",
"BINDIR=L\\\"/usr/local/bin\\\"",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -1365,7 +1371,7 @@
"PREFIX=L\\\"/usr/local\\\"",
"DATADIR=L\\\"/usr/local/share\\\"",
"SYSCONFDIR=L\\\"/usr/local/etc\\\"",
"BINDIR=L\\\"/usr/local/bin\\\"",
"BINDIR=L\\\"/usr/local/bin\\\"",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;