Expresion* Sintactico::_ParseTerm(Expresion* her) { //Utilizamos Primeros( multiplicative-operator ) if ( proximo_token.GetTipo() == op_mul || proximo_token.GetTipo() == op_div || proximo_token.GetTipo() == op_divent || proximo_token.GetTipo() == op_mod || proximo_token.GetTipo() == op_and ) { tipo_token tipo_mul = ParseMultiplicativeOperator(); Expresion* expr = ParseFactor(); Expresion* sin; switch ( tipo_mul ) { case op_mul: sin = new Multiplicacion(her,expr); break; case op_div: sin = new Division(her,expr); break; case op_divent: sin = new Division(her,expr); break; case op_mod: sin = new Modulo(her,expr); break; case op_and: sin = new AndBinario(her,expr); break; default: break; } return _ParseTerm(sin); } return her; }
/*! Initializes the keyboard layout from the data given. The string has to be a valid keyboard layout description, otherwise an error is returned. */ status_t KeyboardLayout::_InitFrom(const char* data) { _FreeKeys(); VariableMap variables; BPoint rowLeftTop; int32 lastKeyCount = 0; Key key; parse_state state = {kPairs, 1}; while (data[0] != '\0') { _SkipCommentsAndSpace(state, data); if (data[0] == '[') { state.mode = kRowStart; rowLeftTop = BPoint(0, 0); data++; continue; } else if (data[0] == '\0') break; switch (state.mode) { case kPairs: { BString name; BString value; if (!_GetPair(state, data, name, value)) return B_BAD_VALUE; TRACE("<%s> = <%s>\n", name.String(), value.String()); if (name == "name") fName = value; else if (name == "default-size") { const char* valueString = value.String(); parse_state tempState = {kSize, state.line}; BString term; if (!_ParseTerm(tempState, valueString, term, variables)) return B_BAD_VALUE; TRACE(" size = %s\n", term.String()); if (!_GetSize(state, term.String(), fDefaultKeySize.width, fDefaultKeySize.height)) return B_BAD_VALUE; } else if (name[0] == '$') variables[name] = value; break; } case kRowStart: case kKeyShape: case kKeyCodes: { if (data[0] == ']') { if (state.mode == kKeyShape) { state.mode = kPairs; data++; continue; } _Error(state, "unexpected row closing bracket"); return B_BAD_VALUE; } BString term; if (!_ParseTerm(state, data, term, variables)) return B_BAD_VALUE; switch (state.mode) { case kRowStart: if (!_GetSize(state, term.String(), rowLeftTop.x, rowLeftTop.y)) return B_BAD_VALUE; TRACE("row: %s (%g:%g)\n", term.String(), rowLeftTop.x, rowLeftTop.y); state.mode = kKeyShape; break; case kKeyShape: memset(&key, 0, sizeof(Key)); if (!_GetShape(state, term.String(), key)) return B_BAD_VALUE; TRACE(" shape: %s (%g:%g:%g)\n", term.String(), key.frame.Width(), key.frame.Height(), key.second_row); lastKeyCount = 0; state.mode = kKeyCodes; break; case kKeyCodes: TRACE(" raw key: %s\n", term.String()); if (!_AddKeyCodes(state, rowLeftTop, key, term.String(), lastKeyCount)) return B_BAD_VALUE; if (data[0] != ':') state.mode = kKeyShape; break; default: break; } if (data[0] != ']' && data[0] != '\0') data++; break; } default: return B_BAD_VALUE; } } return B_OK; }
Expresion* Sintactico::ParseTerm() { Expresion* expr = ParseFactor(); return _ParseTerm(expr); }