ROSE 0.11.145.147
|
Parser building blocks for creating simple recursive descent parsers generating AST from strings.
Liao 4/13/2011 An experimental SgStatement* SageBuilder::buildStatementFromString(string&, SgScopeStatement* scope) is provided. 10/2015
Support creating simple recursive descent parsers of source code annotations
The namespace, AstFromString, collects a set of helper functions (or parser building blocks) that operate on an input string to create simple recursive descent parsers for source code annotations(C/C++ pragmas or Fortran comments).
Functions | |
Character check , without side effect on the current position | |
utility functions for checking characters, without changing the current position of the input string being parsed. | |
bool | afs_is_digit () |
Check if the current character is a digit. The current position of the input string remains unchanged either way. | |
bool | afs_is_identifier_char () |
Check if the current character is a legal identifier character, including letters, digits, '_' and '$' (For fortran). No side effect on the current position. | |
bool | afs_is_letter () |
Check if the current character is a letter. No side effect on the current position of the input string. | |
bool | afs_is_lower_letter () |
Check if the current character is a lower case letter. | |
bool | afs_is_upper_letter () |
Check if the current character is a upper case letter. | |
Match with side effects (set c_parsed_node and advance the current position of character) if successful. Return false and have no side effects if the match fails. | |
utility functions for matching string, whitespace, identifiers, const etc. Successful match will advance the current position. entry point, declarations, types Follow the order of http://www.antlr.org/grammar/1153358328744/C.g | |
ROSE_DLL_API bool | afs_match_char (char c) |
match a char, advance one position if successful. | |
ROSE_DLL_API bool | afs_match_substr (const char *substr, bool checkTrail=true) |
Match a sub string: a given sub c string from the input c string, again skip heading space/tabs if any. | |
ROSE_DLL_API bool | afs_skip_whitespace () |
Match and skip whitespace. | |
ROSE_DLL_API bool | afs_match_identifier () |
Match identifier, move to the next character if successful. The identifier could be a name of a type, function, variable, or label. The resolved identifier (type , variable name, function reference expression, or label name) is stored into c_parsed_node. | |
ROSE_DLL_API bool | afs_match_integer_const (int *result) |
Match an integer constant, store it into result. | |
ROSE_DLL_API bool | afs_match_double_const (double *result) |
Match an double constant, store it into result. | |
ROSE_DLL_API bool | afs_match_translation_unit () |
Match a translation unit. Not yet implemented. | |
ROSE_DLL_API bool | afs_match_external_declaration () |
Match an external declaration. Not yet implemented. | |
ROSE_DLL_API bool | afs_match_function_definition () |
Match a function definition. Not yet implemented. | |
ROSE_DLL_API bool | afs_match_declaration () |
Match a declaration. Only the simplest int i=9; style declaration is supported for now. | |
ROSE_DLL_API bool | afs_match_declaration_specifiers (SgType **tt) |
Match declaration specifiers, store the matched type into *tt. | |
ROSE_DLL_API bool | afs_match_init_declarator_list () |
Match an init declarator list. Not yet implemented. | |
ROSE_DLL_API bool | afs_match_init_declarator (SgType *orig_type, SgType **mod_type, SgName **sname, SgExpression **initializer) |
Match init declarator. Store created mod_type, name, and initializer. Original type is needed as input to generate the modifier type. | |
ROSE_DLL_API bool | afs_match_storage_class_specifier () |
Match a storage class specifier. Not yet implemented. | |
ROSE_DLL_API bool | afs_match_type_specifier (bool checkTrail=true) |
ROSE_DLL_API bool | afs_match_specifier_qualifier_list (std::vector< SgNode * > &) |
Match a list of specifiers and qualifiers : : ( type_qualifier | type_specifier )+. | |
ROSE_DLL_API bool | afs_match_type_qualifier () |
Match a type qualifier : 'const' | 'volatile'. | |
ROSE_DLL_API bool | afs_match_declarator (SgType *orig_type, SgType **modified_type) |
Match a declarator. | |
ROSE_DLL_API bool | afs_match_direct_declarator () |
Match a direct declarator. | |
ROSE_DLL_API bool | afs_match_pointer (SgType *orig_type) |
Pointer constructs like * type. | |
ROSE_DLL_API bool | afs_match_type_name () |
Match a type name : specifier_qualifier_list abstract_declarator? | |
bool | afs_match_initializer () |
match a char, advance one position if successful. | |
Expression | |
utility functions for parsing expressions and generate AST pieces for them. Successful match will advance the current position. The function names and grammars largely follow the conventions used in http://www.antlr.org/grammar/1153358328744/C.g. For example in the grammar shown, | means or, * means 0 or more repetition of the previous term , ? means 0 or 1 occurrence of the previous term. + means 1 or more occurrence. | |
ROSE_DLL_API bool | afs_match_argument_expression_list () |
Grammar: argument_expression_list : assignment_expression (',' assignment_expression)* one assignment_expression, followed by optionally arbitrary numbers of (',' assignment_expression), store SgExprListExp to c_parsed_node. | |
ROSE_DLL_API bool | afs_match_additive_expression () |
Grammar: additive_expression : (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)*. | |
ROSE_DLL_API bool | afs_match_multiplicative_expression () |
multiplicative_expression : (cast_expression) ('*' cast_expression | '/' cast_expression | '' cast_expression)* | |
ROSE_DLL_API bool | afs_match_cast_expression () |
cast_expression : '(' type_name ')' cast_expression | unary_expression | |
ROSE_DLL_API bool | afs_match_unary_expression () |
unary_expression : postfix_expression | INC_OP unary_expression | DEC_OP unary_expression | unary_operator cast_expression | SIZEOF unary_expression | SIZEOF '(' type_name ')' | |
ROSE_DLL_API bool | afs_match_postfix_expression () |
postfix_expression : primary_expression ( '[' expression ']' | '(' ')' | '(' argument_expression_list ')' | '.' IDENTIFIER | '->' IDENTIFIER | '++' | '–' )* | |
ROSE_DLL_API bool | afs_match_primary_expression () |
primary_expression : IDENTIFIER | constant | '(' expression ')' | |
ROSE_DLL_API bool | afs_match_constant () |
Only integer constant is supported for now. Full grammar is constant : HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | STRING_LITERAL | FLOATING_POINT_LITERAL. | |
ROSE_DLL_API bool | afs_match_expression () |
expression : assignment_expression (',' assignment_expression)*. Match one or more assignment_expression | |
ROSE_DLL_API bool | afs_match_constant_expression () |
constant_expression : conditional_expression | |
ROSE_DLL_API bool | afs_match_assignment_expression () |
assignment_expression : lvalue assignment_operator assignment_expression | conditional_expression | |
ROSE_DLL_API bool | afs_match_lvalue () |
lvalue: unary_expression | |
ROSE_DLL_API bool | afs_match_conditional_expression () |
conditional_expression : logical_or_expression ('?' expression ':' conditional_expression)? '?' means 0 or 1 occurrence | |
ROSE_DLL_API bool | afs_match_logical_or_expression () |
logical_or_expression : logical_and_expression ('||' logical_and_expression)* | |
ROSE_DLL_API bool | afs_match_logical_and_expression () |
logical_and_expression : inclusive_or_expression ('&&' inclusive_or_expression)* | |
ROSE_DLL_API bool | afs_match_inclusive_or_expression () |
inclusive_or_expression : exclusive_or_expression ('|' exclusive_or_expression)* | |
ROSE_DLL_API bool | afs_match_exclusive_or_expression () |
exclusive_or_expression : and_expression ('^' and_expression)* | |
ROSE_DLL_API bool | afs_match_and_expression () |
and_expression : equality_expression ('&' equality_expression)* | |
ROSE_DLL_API bool | afs_match_equality_expression () |
equality_expression : relational_expression (('=='|'!=') relational_expression)* | |
ROSE_DLL_API bool | afs_match_relational_expression () |
relational_expression : shift_expression (('<'|'>'|'<='|'>=') shift_expression)* | |
ROSE_DLL_API bool | afs_match_shift_expression () |
shift_expression : additive_expression (('<<'|'>>') additive_expression)* | |
Statement | |
utility functions to parse a few statements. Successful match will advance the current position. INCOMPLETE now, Don't use them yet! | |
ROSE_DLL_API bool | afs_match_statement () |
match any statement, not complete yet. Don't use it yet . : labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | |
ROSE_DLL_API bool | afs_match_labeled_statement () |
Match labeled statement : IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement. | |
ROSE_DLL_API bool | afs_match_compound_statement () |
Not yet implemented. Match compound statement: '{' declaration* statement_list? '}'. | |
ROSE_DLL_API bool | afs_match_expression_statement () |
Match expression statement: : ';' | expression ';'. | |
ROSE_DLL_API bool | afs_match_selection_statement () |
Match selection statement: IF '(' expression ')' statement | IF '(' expression ')' statement ELSE statement | SWITCH '(' expression ')' statement. | |
ROSE_DLL_API bool | afs_match_iteration_statement () |
Match an iteration statement: : 'while' '(' expression ')' statement | 'do' statement 'while' '(' expression ')' ';' | 'for' '(' expression_statement expression_statement expression? ')' statement. | |
ROSE_DLL_API bool | afs_match_jump_statement () |
Match a jump statement : 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';'. | |
Variables | |
Namespace scope variables | |
Semi-global variables | |
ROSE_DLL_API const char * | c_char |
A namespace scope char* to avoid passing and returning a target c string for every and each function current characters being scanned, what is pointed is const, the pointer itself is not const. | |
ROSE_DLL_API SgNode * | c_sgnode |
current anchor SgNode associated with parsing. It will serve as a start point to find enclosing scopes for resolving identifiers/symbols | |
ROSE_DLL_API SgNode * | c_parsed_node |
Store the AST substree (expression, statement) generated from a helper function. | |
ROSE_DLL_API bool AstFromString::afs_match_substr | ( | const char * | substr, |
bool | checkTrail = true |
||
) |
Match a sub string: a given sub c string from the input c string, again skip heading space/tabs if any.
checkTrail: Check the immediate following character after the match, it must be one of whitespace, end of str, newline, tab, (, ), or '!', etc. It is set to true by default, used to ensure the matched substr is a full identifier/keywords. Note: If try to match non-identifier, such as operators +=, etc), please set checkTrail to false!! But Fortran OpenMP allows blanks/tabs to be ignored between certain pair of keywords: e.g: end critical == endcritical , parallel do == paralleldo to match the 'end' and 'parallel', we have to skip trail checking. return values:
ROSE_DLL_API bool AstFromString::afs_match_type_specifier | ( | bool | checkTrail = true | ) |
Match a type specifier : 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | struct_or_union_specifier | enum_specifier | type_id. The recognized type is stored in c_parsed_node.
checkTrail | if false it authorizes any character to follow the type. Used to parse fragments of C (as a comma separated list of types) |
|
extern |
A namespace scope char* to avoid passing and returning a target c string for every and each function current characters being scanned, what is pointed is const, the pointer itself is not const.