ROSE 編譯器框架/處理編譯指示
外觀
使用編譯指示來指導翻譯器通常很有用。
提供了一組解析器構建函式來幫助建立遞迴下降解析器。
包含標頭檔案 AstFromString.h(位於 src/frontend/SageIII/astFromString)後,就可以訪問名稱空間中定義的變數和函式。
有一個示例專案對編譯指示進行解析,並將結果儲存到 AST 屬性中。 https://github.com/rose-compiler/rose-develop/tree/master/projects/pragmaParsing
左遞迴
遞迴規則被轉換為重複規則
/* YACC left recursion rule
argument_expression_list
: assignment_expression
| argument_expression_list ',' assignment_expression
Or in ANTLR as repetition
argument_expression_list
: assignment_expression (',' assignment_expression)*
;
*/
bool afs_match_argument_expression_list()
{
bool result =false;
const char* old_char = c_char;
SgExprListExp* parameters = NULL;
if (afs_match_assignment_expression())
{
SgExpression* arg1 = isSgExpression(c_parsed_node);
assert (arg1 != NULL);
parameters = buildExprListExp(arg1);
c_parsed_node = parameters;
result = true;
}
else
{ // immediate return false when first required term is not matched
c_char = old_char;
return false;
}
// match optional additional expressions
old_char = c_char; // set rollback point
while (afs_match_char(','))
{
if (afs_match_assignment_expression())
{
SgExpression* argx = isSgExpression(c_parsed_node);
assert(argx != NULL);
appendExpression(parameters, argx);
c_parsed_node = parameters; // must set it again since it was rewritten in match_assignment_expression()
}
else
{
c_char = old_char; // optional match fails, rollback
// printf("error. afs_match_argument_expression_list() expects assignment_expression after matching ','\n");
// assert (0);
break; // and break out
}
// prepare next round
old_char = c_char;
}
assert (parameters != NULL);
// c_parsed_node = parameters; // this is necessary since the while loop may rewrite c_parsed_node
assert (c_parsed_node == parameters);
return true;
}