Changeset 1ebc1a62 in mainline for uspace/app/sbi/src/p_expr.c


Ignore:
Timestamp:
2010-03-29T20:30:29Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a95310e
Parents:
5da468e
Message:

Update SBI to rev. 157.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/sbi/src/p_expr.c

    r5da468e r1ebc1a62  
    3131#include <assert.h>
    3232#include <stdlib.h>
     33#include "debug.h"
    3334#include "lex.h"
    3435#include "list.h"
     
    5758static stree_expr_t *parse_self_ref(parse_t *parse);
    5859
    59 /** Parse expression. */
     60static stree_expr_t *parse_recovery_expr(parse_t *parse);
     61
     62/** Parse expression.
     63 *
     64 * Input is read from the input object associated with @a parse. If any
     65 * error occurs, parse->error will @c b_true when this function
     66 * returns. parse->error_bailout will be @c b_true if the error has not
     67 * been recovered yet. Similar holds for other parsing functions in this
     68 * module.
     69 *
     70 * @param parse         Parser object.
     71 */
    6072stree_expr_t *parse_expr(parse_t *parse)
    6173{
     74#ifdef DEBUG_PARSE_TRACE
     75        printf("Parse expression.\n");
     76#endif
     77        if (parse_is_error(parse))
     78                return parse_recovery_expr(parse);
     79
    6280        return parse_assign(parse);
    6381}
    6482
    65 /** Parse assignment expression. */
     83/** Parse assignment expression.
     84 *
     85 * @param parse         Parser object.
     86 */
    6687static stree_expr_t *parse_assign(parse_t *parse)
    6788{
     
    93114}
    94115
    95 /** Parse comparative expression. */
     116/** Parse comparative expression.
     117 *
     118 * @param parse         Parser object.
     119 */
    96120static stree_expr_t *parse_comparative(parse_t *parse)
    97121{
     
    105129            lcur_lc(parse) == lc_lt || lcur_lc(parse) == lc_gt ||
    106130            lcur_lc(parse) == lc_lt_equal || lcur_lc(parse) == lc_gt_equal) {
     131
     132                if (parse_is_error(parse))
     133                        break;
    107134
    108135                switch (lcur_lc(parse)) {
     
    131158}
    132159
    133 /** Parse additive expression. */
     160/** Parse additive expression.
     161 *
     162 * @param parse         Parser object.
     163 */
    134164static stree_expr_t *parse_additive(parse_t *parse)
    135165{
     
    139169        a = parse_prefix(parse);
    140170        while (lcur_lc(parse) == lc_plus) {
     171                if (parse_is_error(parse))
     172                        break;
     173
    141174                lskip(parse);
    142175                b = parse_prefix(parse);
     
    154187}
    155188
    156 /** Parse prefix expression. */
     189/** Parse prefix expression.
     190 *
     191 * @param parse         Parser object.
     192 */
    157193static stree_expr_t *parse_prefix(parse_t *parse)
    158194{
     
    162198        case lc_plus:
    163199                printf("Unimplemented: Unary plus.\n");
    164                 exit(1);
     200                a = parse_recovery_expr(parse);
     201                parse_note_error(parse);
     202                break;
    165203        case lc_new:
    166204                a = parse_prefix_new(parse);
     
    174212}
    175213
    176 /** Parse @c new operator. */
     214/** Parse @c new operator.
     215 *
     216 * @param parse         Parser object.
     217 */
    177218static stree_expr_t *parse_prefix_new(parse_t *parse)
    178219{
     
    198239}
    199240
    200 /** Parse postfix expression. */
     241/** Parse postfix expression.
     242 *
     243 * @param parse         Parser object.
     244 */
    201245static stree_expr_t *parse_postfix(parse_t *parse)
    202246{
     
    208252        while (lcur_lc(parse) == lc_period || lcur_lc(parse) == lc_lparen ||
    209253            lcur_lc(parse) == lc_lsbr || lcur_lc(parse) == lc_as) {
     254
     255                if (parse_is_error(parse))
     256                        break;
    210257
    211258                switch (lcur_lc(parse)) {
     
    232279}
    233280
    234 /** Parse member access expression */
     281/** Parse member access expression
     282 *
     283 * @param parse         Parser object.
     284 */
    235285static stree_expr_t *parse_pf_access(parse_t *parse, stree_expr_t *a)
    236286{
     
    252302}
    253303
    254 /** Parse function call expression. */
     304/** Parse function call expression.
     305 *
     306 * @param parse         Parser object.
     307 */
    255308static stree_expr_t *parse_pf_call(parse_t *parse, stree_expr_t *a)
    256309{
     
    268321
    269322        if (lcur_lc(parse) != lc_rparen) {
    270                 while (b_true) {
     323                while (!parse_is_error(parse)) {
    271324                        arg = parse_expr(parse);
    272325                        list_append(&call->args, arg);
     
    286339}
    287340
    288 /** Parse index expression. */
     341/** Parse index expression.
     342 *
     343 * @param parse         Parser object.
     344 */
    289345static stree_expr_t *parse_pf_index(parse_t *parse, stree_expr_t *a)
    290346{
     
    302358
    303359        if (lcur_lc(parse) != lc_rsbr) {
    304                 while (b_true) {
     360                while (!parse_is_error(parse)) {
    305361                        arg = parse_expr(parse);
    306362                        list_append(&index->args, arg);
     
    320376}
    321377
    322 /** Parse @c as operator. */
     378/** Parse @c as operator.
     379 *
     380 * @param parse         Parser object.
     381 */
    323382static stree_expr_t *parse_pf_as(parse_t *parse, stree_expr_t *a)
    324383{
     
    339398}
    340399
    341 /** Parse primitive expression. */
     400/** Parse primitive expression.
     401 *
     402 * @param parse         Parser object.
     403 */
    342404static stree_expr_t *parse_primitive(parse_t *parse)
    343405{
     
    362424        default:
    363425                lunexpected_error(parse);
    364                 exit(1);
    365         }
    366 
    367         return expr;
    368 }
    369 
    370 /** Parse name reference. */
     426                expr = parse_recovery_expr(parse);
     427        }
     428
     429        return expr;
     430}
     431
     432/** Parse name reference.
     433 *
     434 * @param parse         Parser object.
     435 */
    371436static stree_expr_t *parse_nameref(parse_t *parse)
    372437{
     
    382447}
    383448
    384 /** Parse integer literal. */
     449/** Parse integer literal.
     450 *
     451 * @param parse         Parser object.
     452 */
    385453static stree_expr_t *parse_lit_int(parse_t *parse)
    386454{
     
    401469}
    402470
    403 /** Parse reference literal (@c nil). */
     471/** Parse reference literal (@c nil).
     472 *
     473 * @param parse         Parser object.
     474 */
    404475static stree_expr_t *parse_lit_ref(parse_t *parse)
    405476{
     
    417488}
    418489
    419 /** Parse string literal. */
     490/** Parse string literal.
     491 *
     492 * @param parse         Parser object.
     493 */
    420494static stree_expr_t *parse_lit_string(parse_t *parse)
    421495{
     
    436510}
    437511
    438 /** Parse @c self keyword. */
     512/** Parse @c self keyword.
     513 *
     514 * @param parse         Parser object.
     515 */
    439516static stree_expr_t *parse_self_ref(parse_t *parse)
    440517{
     
    451528        return expr;
    452529}
     530
     531/** Construct a special recovery expression.
     532 *
     533 * @param parse         Parser object.
     534 */
     535static stree_expr_t *parse_recovery_expr(parse_t *parse)
     536{
     537        stree_literal_t *literal;
     538        stree_expr_t *expr;
     539
     540        (void) parse;
     541
     542        literal = stree_literal_new(ltc_ref);
     543
     544        expr = stree_expr_new(ec_literal);
     545        expr->u.literal = literal;
     546
     547        return expr;
     548}
Note: See TracChangeset for help on using the changeset viewer.