pepper package

Submodules

pepper.preprocessor

This module contains the functions necessary to run only the preprocessor

It primarily serves as the entry point to Pepper

pepper.preprocessor.get_args()[source]
pepper.preprocessor.main(args=None)[source]

pepper.symbol_table

The Symbol Table module implements a class to track declarations and usages of identifiers

pepper.symbol_table.FILE_STACK = []

The stack of files we’re reading from

pepper.symbol_table.IFDEF_STACK = []

The stack of ifdef/ifndef/if control structures we’re processing

pepper.symbol_table.LINUX_DEFAULTS = ['/usr/include/c++/7', '/usr/include/x86_64-linux-gnu/c++/7', '/usr/include/c++/7/backward', '/usr/lib/gcc/x86_64-linux-gnu/7/include', '/usr/local/include', '/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed', '/usr/include/x86_64-linux-gnu', '/usr/include']

The default linux paths to search for includes-

class pepper.symbol_table.MacroExpansion(name, expansion, args=None)[source]

Bases: object

Expands an identifier into a macro expansion, possibly with arguments

expand(args=None)[source]

Expand macro, maybe with args

preprocess(lines)[source]
exception pepper.symbol_table.PepperInternalError(msg=None)[source]

Bases: Exception

exception pepper.symbol_table.PepperSyntaxError(msg=None)[source]

Bases: Exception

pepper.symbol_table.SYSTEM_INCLUDE_PATHS = ['/usr/include/c++/7', '/usr/include/x86_64-linux-gnu/c++/7', '/usr/include/c++/7/backward', '/usr/lib/gcc/x86_64-linux-gnu/7/include', '/usr/local/include', '/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed', '/usr/include/x86_64-linux-gnu', '/usr/include']

The list of paths to search when doing a system include

pepper.symbol_table.TABLE = {}

The global symboltable

pepper.symbol_table.TRIGGER_INTERNAL_ERROR = False

Switch to test internal error handling

pepper.abstract_symbol_tree module

This is the abstract symbol tree for PEPPr.

The parser will build the actual tree, so this is really more of a library of nodes that may be used within the tree.

class pepper.abstract_symbol_tree.ASCIILiteralNode(children)[source]

Bases: pepper.abstract_symbol_tree.PrimitiveNode

class pepper.abstract_symbol_tree.IdentifierNode(children, args=None, variadic=False)[source]

Bases: pepper.abstract_symbol_tree.Node

preprocess(lines=None)[source]
class pepper.abstract_symbol_tree.LinesNode(children=None)[source]

Bases: pepper.abstract_symbol_tree.Node

preprocess(lines=None)[source]
class pepper.abstract_symbol_tree.NewlineNode(children)[source]

Bases: pepper.abstract_symbol_tree.PrimitiveNode

preprocess(lines)[source]
class pepper.abstract_symbol_tree.Node(name='Node', children=None)[source]

Bases: object

preprocess(lines)[source]
class pepper.abstract_symbol_tree.PreprocessingNumberNode(children)[source]

Bases: pepper.abstract_symbol_tree.PrimitiveNode

class pepper.abstract_symbol_tree.PreprocessorDirectiveNode(children)[source]

Bases: pepper.abstract_symbol_tree.Node

class pepper.abstract_symbol_tree.PreprocessorIncludeNode(children, system_include=False)[source]

Bases: pepper.abstract_symbol_tree.Node

preprocess(lines)[source]

This will be a lie for a while. I’ll have to fix it later.

search_system_includes()[source]
class pepper.abstract_symbol_tree.PrimitiveNode(name, children)[source]

Bases: pepper.abstract_symbol_tree.Node

preprocess(lines=None)[source]
class pepper.abstract_symbol_tree.StringLiteralNode(children)[source]

Bases: pepper.abstract_symbol_tree.PrimitiveNode

class pepper.abstract_symbol_tree.WhiteSpaceNode(children)[source]

Bases: pepper.abstract_symbol_tree.PrimitiveNode

pepper.lexer module

This is the lexer for PEPPr

It’s responsible for tokenizing the incoming character stream. The Parser will ingest the token stream and build a tree, which will in turn produce actual c++ or c code.

pepper.lexer.get_args()[source]
pepper.lexer.lex(lines, debug_mode=False)[source]

Takes a single string, containing newlines, that’s the entire input

pepper.lexer.main()[source]
pepper.lexer.t_COMMENT(t)[source]

s//.*

pepper.lexer.t_COMMENT_NO_WHITESPACE(t)[source]

//.*

pepper.lexer.t_IDENTIFIER(t)[source]

([_a-zA-Z][_a-zA-Z0-9]*(…)?)|(…)

pepper.lexer.t_LONG_COMMENT_START(t)[source]

/*

pepper.lexer.t_NEWLINE(t)[source]

n

pepper.lexer.t_PREPROCESSING_KEYWORD_DEFINE(t)[source]

#defineb

pepper.lexer.t_PREPROCESSING_KEYWORD_ELSE(t)[source]

#elseb

pepper.lexer.t_PREPROCESSING_KEYWORD_ENDIF(t)[source]

#endifb

pepper.lexer.t_PREPROCESSING_KEYWORD_IF(t)[source]

#ifb

pepper.lexer.t_PREPROCESSING_KEYWORD_IFDEF(t)[source]

#ifdefb

pepper.lexer.t_PREPROCESSING_KEYWORD_IFNDEF(t)[source]

#ifndefb

pepper.lexer.t_PREPROCESSING_KEYWORD_INCLUDE(t)[source]

#includeb

pepper.lexer.t_PREPROCESSING_KEYWORD_PY(t)[source]

#pyb

pepper.lexer.t_PREPROCESSING_NUMBER(t)[source]

.?[0-9]([0-9]|(e+)|(e-)|(E+)|(E-)|(p+)|(p-)|(P+)|(P-)|[a-zA-Z])*

pepper.lexer.t_STRING_LITERAL(t)[source]

(‘((\[‘tn])|[^’\])*’)|(“((\[“tn])|[^”\])*”)

pepper.lexer.t_SYSTEM_INCLUDE_LITERAL(t)[source]

<[^’”<>]*?>

pepper.lexer.t_WHITESPACE(t)[source]

[t ]

pepper.lexer.t_comment_BLOCK_COMMENT_END(t)[source]

*/

pepper.lexer.t_comment_NEWLINE(t)[source]

n

pepper.lexer.t_comment_error(t)[source]
pepper.lexer.t_comment_ignore_anything_else(t)[source]

.+?

pepper.lexer.t_error(t)[source]

pepper.parser module

This is the Parser module for Pepper

This module impelements the grammar for the preprocessor language, comprised of tokens from the Lexer module. This module implements a main function, but this is only for debugging and will be removed on release.

pepper.parser.get_args()[source]
pepper.parser.main()[source]
pepper.parser.p_code_expression_to_safe(p)[source]

code_expression : safe_code_expression

pepper.parser.p_define_expansion(p)[source]

macro_expansion : code_expressions

pepper.parser.p_define_expression_no_args(p)[source]

define_expression : PREPROCESSING_KEYWORD_DEFINE WHITESPACE IDENTIFIER WHITESPACE macro_expansion

pepper.parser.p_define_expression_no_expansion(p)[source]

define_expression : PREPROCESSING_KEYWORD_DEFINE WHITESPACE IDENTIFIER

pepper.parser.p_define_expression_some_args(p)[source]

define_expression : PREPROCESSING_KEYWORD_DEFINE WHITESPACE IDENTIFIER ‘(‘ identifier_list ‘)’ maybe_space macro_expansion

pepper.parser.p_else_expression(p)[source]

else_expression : PREPROCESSING_KEYWORD_ELSE

pepper.parser.p_endif_expression(p)[source]

endif_expression : PREPROCESSING_KEYWORD_ENDIF

pepper.parser.p_error(p)[source]
pepper.parser.p_expression_list_empty(p)[source]

list_of_expressions :

pepper.parser.p_expression_list_multiple(p)[source]

list_of_expressions : list_of_expressions ‘,’ safe_code_expressions

pepper.parser.p_expression_list_singleton(p)[source]

list_of_expressions : safe_code_expressions

pepper.parser.p_expression_to_list_of_something(p)[source]

code_expression_parenthetical : ‘(‘ list_of_expressions ‘)’

pepper.parser.p_expression_to_string_lit(p)[source]

safe_code_expression : STRING_LITERAL

pepper.parser.p_expressions(p)[source]

code_expressions : code_expressions code_expression

pepper.parser.p_expressions_empty(p)[source]

code_expressions :

pepper.parser.p_expressions_to_single(p)[source]

code_expressions : code_expression

pepper.parser.p_identifier_call(p)[source]

safe_code_expression : IDENTIFIER code_expression_parenthetical

pepper.parser.p_identifier_list_empty(p)[source]

identifier_list :

pepper.parser.p_identifier_list_multiple(p)[source]

identifier_list : identifier_list ‘,’ maybe_space IDENTIFIER

pepper.parser.p_identifier_list_singleton(p)[source]

identifier_list : IDENTIFIER

pepper.parser.p_ifdef_expression(p)[source]

ifdef_expression : PREPROCESSING_KEYWORD_IFDEF WHITESPACE IDENTIFIER

pepper.parser.p_ifndef_expression(p)[source]

ifndef_expression : PREPROCESSING_KEYWORD_IFNDEF WHITESPACE IDENTIFIER

pepper.parser.p_include_expression(p)[source]
preprocessor_expression : include_expression
define_expression
ifdef_expression
ifndef_expression
endif_expression
else_expression
pepper.parser.p_include_expression_disambiguation(p)[source]
include_expression : include_expression_file
include_expression_system
pepper.parser.p_include_expression_file(p)[source]

include_expression_file : PREPROCESSING_KEYWORD_INCLUDE WHITESPACE STRING_LITERAL

pepper.parser.p_include_expression_system(p)[source]

include_expression_system : PREPROCESSING_KEYWORD_INCLUDE WHITESPACE SYSTEM_INCLUDE_LITERAL

pepper.parser.p_line_to_statement(p)[source]

line : statement NEWLINE

pepper.parser.p_lines_nonempty(p)[source]

lines : lines line

pepper.parser.p_maybe_whitespace_none(p)[source]

maybe_space :

pepper.parser.p_maybe_whitespace_some(p)[source]

maybe_space : WHITESPACE

pepper.parser.p_pepper_directive(p)[source]

pepper_directive : preprocessor_expression

pepper.parser.p_program(p)[source]

program : lines statement

pepper.parser.p_safe_code_expression_to_parens(p)[source]

safe_code_expression : code_expression_parenthetical

pepper.parser.p_safe_code_expressions_ascii_literal(p)[source]
safe_code_expression : ‘<’
‘>’
‘+’
‘-‘
‘%’
‘^’
‘&’
‘*’
‘{‘
‘}’
‘[‘
‘]’
‘=’
‘;’
‘:’
‘#’
‘.’
‘?’
‘~’
pepper.parser.p_safe_expressions(p)[source]

safe_code_expressions : safe_code_expressions safe_code_expression

pepper.parser.p_safe_expressions_empty(p)[source]

safe_code_expressions :

pepper.parser.p_statement_to_ascii_literal(p)[source]
code_expression :
‘,’
‘(‘
‘)’
pepper.parser.p_statement_to_code_expression(p)[source]

statement : code_expressions

pepper.parser.p_statement_to_identifier(p)[source]

safe_code_expression : IDENTIFIER

pepper.parser.p_statement_to_pepper_directive(p)[source]

statement : pepper_directive

pepper.parser.p_statement_to_preprocessing_number(p)[source]

safe_code_expression : PREPROCESSING_NUMBER

pepper.parser.p_statements_empty(p)[source]

lines :

pepper.parser.p_whitespace_unsafe(p)[source]

safe_code_expression : WHITESPACE

pepper.parser.parse(source, debug_mode=False)[source]

Module contents