AstFromString Namespace Reference


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).


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

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. More...
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.

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 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)*

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 ';'.


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. More...
ROSE_DLL_API SgNodec_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 SgNodec_parsed_node
 Store the AST substree (expression, statement) generated from a helper function.

Function Documentation

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:

  • true: find a match, the current char is pointed to the next char after the substr
  • false: no match, the current char is intact
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.

checkTrailif false it authorizes any character to follow the type. Used to parse fragments of C (as a comma separated list of types)

Variable Documentation

ROSE_DLL_API const char* AstFromString::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.