本文整理汇总了Python中utils.rules.rules函数的典型用法代码示例。如果您正苦于以下问题:Python rules函数的具体用法?Python rules怎么用?Python rules使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了rules函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Python代码示例。
示例1: postfix_expression
def postfix_expression(tokens, symbol_table):
"""
: primary_expression
( '[' expression ']'
| '(' ')'
| '(' argument_expression_list ')'
| '.' IDENTIFIER
| '->' IDENTIFIER
| '++'
| '--' )*
"""
type_name, expression, initializer, primary_expression = imap(
symbol_table.__getitem__,
('__ type_name __', '__ expression __', '__ initializer __', '__ primary_expression __')
)
# if primary_exp is None:
# if peek_or_terminal(tokens) == TOKENS.LEFT_PARENTHESIS and consume(tokens):
# # Again slight ambiguity since primary_expression may start with '(' expression ')'
# # can't call cast_expression since it will try to call postfix_expression.
# if is_type_name(peek_or_terminal(tokens), symbol_table):
# ctype, _ = type_name(tokens, symbol_table), error_if_not_value(tokens, TOKENS.RIGHT_PARENTHESIS)
# primary_exp = CompoundLiteral(initializer(tokens, symbol_table), ctype, loc(ctype))
# else: # if we saw a parenthesis and it wasn't a type_name then it must be primary_expr `(` expression `)`
# primary_exp, _ = expression(tokens, symbol_table), error_if_not_value(tokens, TOKENS.RIGHT_PARENTHESIS)
# else:
# primary_exp = primary_expression(tokens, symbol_table)
primary_exp = primary_expression(tokens, symbol_table)
while peek_or_terminal(tokens) in rules(postfix_expression):
primary_exp = rules(postfix_expression)[peek(tokens)](tokens, symbol_table, primary_exp)
return primary_exp
开发者ID:qs9816,项目名称:c_compiler,代码行数:31,代码来源:postfix.py
示例2: compound_assignment
def compound_assignment(expr, symbol_table):
assert all(imap(isinstance, imap(c_type, (left_exp(expr), right_exp(expr))), repeat(NumericType)))
assert not isinstance(c_type(left_exp(expr)), ArrayType)
if isinstance(left_exp(expr), IdentifierExpression) and \
base_c_type(c_type(left_exp(expr))) == base_c_type(c_type(right_exp(expr))) and \
size(c_type(left_exp(expr))) == size(c_type(right_exp(expr))):
# check that both operands are of the same kind (integral vs numeric) and have the same size ...
return simple_numeric_assignment_no_casting(expr, symbol_table, rules(compound_assignment)[oper(expr)])
max_type = max(imap(c_type, (left_exp(expr), right_exp(expr)))) # cast to largest type.
expression = symbol_table['__ expression __']
left_instrs = cast( # cast to max_type
patch_comp_left_instrs(expression(left_exp(expr), symbol_table), loc(expr), size(c_type(left_exp(expr)))),
c_type(left_exp(expr)),
max_type,
loc(expr),
)
right_instrs = cast(expression(right_exp(expr), symbol_table), c_type(right_exp(expr)), max_type, loc(expr))
return patch_comp_assignment(
cast( # Cast the result back, swap the value and the destination address call set to save.
rules(compound_assignment)[oper(expr)](
left_instrs,
right_instrs,
loc(expr),
(max_type, c_type(left_exp(expr)), c_type(right_exp(expr)))
),
max_type,
c_type(expr),
loc(expr)
),
c_type(expr),
loc(expr),
)
开发者ID:qs9816,项目名称:c_compiler,代码行数:34,代码来源:binary.py
示例3: multiplicative_expression
def multiplicative_expression(tokens, symbol_table):
# : cast_expression ('*' cast_expression | '/' cast_expression | '%' cast_expression)*
cast_expression = symbol_table['__ cast_expression __']
exp = cast_expression(tokens, symbol_table)
while peek(tokens, '') in rules(multiplicative_expression):
exp = get_binary_expression(
tokens, symbol_table, exp, cast_expression, rules(multiplicative_expression)[peek(tokens)]
)
return exp
开发者ID:qs9816,项目名称:c_compiler,代码行数:9,代码来源:binary.py
示例4: unary_expression
def unary_expression(tokens, symbol_table):
"""
: postfix_expression
| '++' unary_expression
| '--' unary_expression
| unary_operator cast_expression
| 'sizeof' (type_name | unary_expression)
"""
error_if_empty(tokens)
if peek_or_terminal(tokens) in rules(unary_expression) and not isinstance(peek(tokens), CONSTANT):
return rules(unary_expression)[peek(tokens)](tokens, symbol_table)
return symbol_table['__ postfix_expression __'](tokens, symbol_table)
开发者ID:qs9816,项目名称:c_compiler,代码行数:14,代码来源:unary.py
示例5: iteration_statement
def iteration_statement(tokens, symbol_table):
"""
: 'while' '(' expression ')' statement
| 'do' statement 'while' '(' expression ')' ';'
| 'for' '(' expression?; expression?; expression? ')' statement
"""
return rules(iteration_statement)[peek(tokens, '')](tokens, symbol_table)
开发者ID:qs9816,项目名称:c_compiler,代码行数:7,代码来源:iterations.py
示例6: type_name_or_unary_expression
def type_name_or_unary_expression(tokens, symbol_table):
symbol_table = push(symbol_table)
set_rules(type_name_or_postfix_expression, rules(symbol_table['__ postfix_expression __']))
symbol_table['__ postfix_expression __'] = type_name_or_postfix_expression
unary_exp = symbol_table['__ unary_expression __'](tokens, symbol_table)
_ = pop(symbol_table)
return unary_exp
开发者ID:qs9816,项目名称:c_compiler,代码行数:7,代码来源:cast.py
示例7: logical_operators
def logical_operators(expr, symbol_table):
expression = symbol_table['__ expression __']
return rules(logical_operators)[oper(expr)](
expression(left_exp(expr), symbol_table),
expression(right_exp(expr), symbol_table),
loc(expr),
tuple(imap(size_arrays_as_pointers, imap(c_type, (expr, left_exp(expr), right_exp(expr)))))
)
开发者ID:qs9816,项目名称:c_compiler,代码行数:8,代码来源:binary.py
示例8: unary_operator
def unary_operator(tokens, symbol_table):
operator = consume(tokens)
if operator == TOKENS.LOGICAL_AND:
return AddressOfLabelExpression(
error_if_not_type(consume(tokens, ''), IDENTIFIER), void_pointer_type(loc(operator)), loc(operator)
)
cast_exp = symbol_table['__ cast_expression __'](tokens, symbol_table)
return rules(unary_operator)[operator](cast_exp, operator)
开发者ID:qs9816,项目名称:c_compiler,代码行数:8,代码来源:unary.py
示例9: pre_processor
def pre_processor(char_stream, location): # returns pre_processing symbol or #identifier ...
values = consume(char_stream)
if peek_or_terminal(char_stream) == TOKENS.NUMBER_SIGN: # token concatenation symbol ...
values += consume(char_stream)
else:
_ = exhaust(takewhile({' ', '\t', '\a'}.__contains__, char_stream))
values += ''.join(takewhile(letters.__contains__, char_stream))
return rules(pre_processor).get(values, IDENTIFIER)(values, location)
开发者ID:qs9816,项目名称:c_compiler,代码行数:8,代码来源:parser.py
示例10: type_qualifiers
def type_qualifiers(tokens, _, defaults=None): # : ('const' or volatile or *args)*
values = set(takewhile(rules(type_qualifiers).__contains__, tokens))
const, volatile = imap(values.__contains__, (TOKENS.CONST, TOKENS.VOLATILE))
if not values and not defaults:
raise ValueError('{l} Expected TOKENS.CONST or TOKEN.VOLATILE got {g}'.format(
l=loc(peek(tokens, EOFLocation)), g=peek(tokens, '')
))
return const or defaults[0], volatile or defaults[1]
开发者ID:qs9816,项目名称:c_compiler,代码行数:8,代码来源:type_name.py
示例11: statement
def statement(stmnt, symbol_table):
is_expression = isinstance(stmnt, expressions.Expression)
# Set entry point to False if its an expression or use statement function if present otherwise None.
instrs = rules(statement)[type(stmnt)](stmnt, symbol_table)
# Almost all Expression statements leave a value on the stack, so we must remove it.
if stmnt and is_expression:
instrs = chain(instrs, allocate(-size(c_type(stmnt), overrides={VoidType: 0}), loc(stmnt)))
return instrs
开发者ID:qs9816,项目名称:c_compiler,代码行数:9,代码来源:statement.py
示例12: __calc_if
def __calc_if(expr, token_seq, macros):
tokens = get_block(token_seq, terminating_with={TOKENS.PELIF, TOKENS.PELSE, TOKENS.PENDIF}) # get a single block
if not expr: # if expression is false we have to exhaust ... and search for a true elif expression, else or endif
_ = exhaust(tokens)
tokens = rules(__calc_if)[peek(token_seq)](token_seq, macros)
for t in imap(consume, repeat(tokens)): # emit tokens which will be pre-processed ...
yield t
exhaust_remaining_blocks(token_seq)
开发者ID:qs9816,项目名称:c_compiler,代码行数:10,代码来源:conditional.py
示例13: inc_dec
def inc_dec(expr, symbol_table):
assert not isinstance(c_type(expr), ArrayType) and isinstance(c_type(expr), IntegralType)
value = rules(inc_dec)[type(expr)]
if isinstance(c_type(expr), PointerType):
value *= size_extended(c_type(c_type(expr)))
return get_postfix_update(size(c_type(expr)))(
all_but_last(symbol_table['__ expression __'](exp(expr), symbol_table), Loads, loc(expr)),
value,
loc(expr)
)
开发者ID:qs9816,项目名称:c_compiler,代码行数:11,代码来源:postfix.py
示例14: jump_statement
def jump_statement(tokens, symbol_table):
"""
: 'goto' IDENTIFIER ';'
| 'continue' ';'
| 'break' ';'
| 'return' ';'
| 'return' expression ';'
"""
stmnt = rules(jump_statement)[peek(tokens)](tokens, symbol_table)
_ = error_if_not_value(tokens, TOKENS.SEMICOLON)
yield stmnt
开发者ID:qs9816,项目名称:c_compiler,代码行数:11,代码来源:jumps.py
示例15: get_block
def get_block(token_seq, terminating_with={TOKENS.PENDIF}):
return chain.from_iterable(
imap(
apply,
imap(
rules(get_block).__getitem__,
takewhile(lambda token: token not in terminating_with, imap(peek, repeat(token_seq)))
),
repeat((token_seq,))
)
)
开发者ID:qs9816,项目名称:c_compiler,代码行数:11,代码来源:conditional.py
示例16: type_name_or_postfix_expression
def type_name_or_postfix_expression(tokens, symbol_table):
symbol_table = push(symbol_table)
symbol_table['__ compound_literal __'] = type_name_or_compound_literal
primary_exp = symbol_table['__ primary_expression __'](tokens, symbol_table)
_ = pop(symbol_table)
# pop 'type_name_or_compound_literal' and type_name_or_postfix_expression ...
postfix_expression_rules = rules(symbol_table['__ postfix_expression __'])
if not isinstance(primary_exp, CType): # it must have being an expression ...
while peek_or_terminal(tokens) in postfix_expression_rules:
primary_exp = postfix_expression_rules[peek(tokens)](tokens, symbol_table, primary_exp)
return primary_exp # otherwise it must have being a type_name ...
开发者ID:qs9816,项目名称:c_compiler,代码行数:11,代码来源:cast.py
示例17: exhaust_remaining_blocks
def exhaust_remaining_blocks(token_seq):
exhaust(
imap(
apply,
imap(
rules(exhaust_remaining_blocks).__getitem__,
takewhile(TOKENS.PENDIF.__ne__, imap(peek, repeat(token_seq)))
),
repeat((token_seq,))
)
)
开发者ID:qs9816,项目名称:c_compiler,代码行数:11,代码来源:conditional.py
示例18: type_specifier
def type_specifier(tokens, symbol_table, default=no_default):
"""
: 'void'
| ['signed' | 'unsigned'] 'char' | ['signed' | 'unsigned'] 'short'
| ['signed' | 'unsigned'] 'int' | ['signed' | 'unsigned'] 'long'
| 'float' | 'double'
| struct_specifier
| union_specifier
| enum_specifier
| TYPE_NAME
"""
token = peek_or_terminal(tokens)
if token in rules(type_specifier):
return rules(type_specifier)[token](tokens, symbol_table)
elif isinstance(symbol_table.get(token, token), CType):
return symbol_table[token](loc(consume(tokens)))
elif default is not no_default:
return default
raise ValueError('{l} Expected type_specifier or TYPE_NAME got {got}'.format(
l=loc(peek(tokens, EOFLocation)), got=peek(tokens, '')
))
开发者ID:qs9816,项目名称:c_compiler,代码行数:21,代码来源:type_name.py
示例19: direct_declarator
def direct_declarator(tokens, symbol_table):
"""
: (IDENTIFIER | '(' declarator ')') declarator_suffix*
declarator_suffix
: '[' constant_expression ']'
| '[' ']'
| '(' parameter_type_list ')'
| '(' ')'
"""
dec = get_rule(direct_declarator, peek_or_terminal(tokens), hash_funcs=(type, identity))(tokens, symbol_table)
_ = peek_or_terminal(tokens) in rules(declarator_suffix) and set_core_type(
dec, declarator_suffix(tokens, symbol_table))
return dec
开发者ID:qs9816,项目名称:c_compiler,代码行数:14,代码来源:declarators.py
示例20: relational_operators
def relational_operators(expr, symbol_table):
max_type = max(imap(c_type, (left_exp(expr), right_exp(expr))))
expression = symbol_table['__ expression __']
if isinstance(max_type, ArrayType):
max_type = PointerType(c_type(max_type), loc(max_type))
left_instrs = expression(left_exp(expr), symbol_table)
right_instrs = expression(right_exp(expr), symbol_table)
return rules(relational_operators)[oper(expr)](
cast(left_instrs, c_type(left_exp(expr)), max_type, loc(expr)),
cast(right_instrs, c_type(right_exp(expr)), max_type, loc(expr)),
loc(expr),
(c_type(expr), c_type(left_exp(expr)), c_type(right_exp(expr))),
)
开发者ID:qs9816,项目名称:c_compiler,代码行数:14,代码来源:binary.py
注:本文中的utils.rules.rules函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论