mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-19 05:40:38 +01:00
[poincare/vert_off_lay] Subscript layout serializes without _
This way there is no parsing confusion when copy pasting the subscript of a subscript layout
This commit is contained in:
committed by
EmilieNumworks
parent
aae5e49c01
commit
a06660ee25
@@ -370,6 +370,25 @@ void Parser::parseUnit(Expression & leftHandSide, Token::Type stoppingType) {
|
||||
|
||||
void Parser::parseReservedFunction(Expression & leftHandSide, const Expression::FunctionHelper * const * functionHelper) {
|
||||
const char * name = (**functionHelper).name();
|
||||
|
||||
if (strcmp(name, "log") == 0 && popTokenIfType(Token::LeftBrace)) {
|
||||
// Special case for the log function (e.g. "log{2}(8)")
|
||||
Expression base = parseUntil(Token::RightBrace);
|
||||
if (m_status != Status::Progress) {
|
||||
} else if (!popTokenIfType(Token::RightBrace)) {
|
||||
m_status = Status::Error; // Right brace missing.
|
||||
} else {
|
||||
Expression parameter = parseFunctionParameters();
|
||||
if (m_status != Status::Progress) {
|
||||
} else if (parameter.numberOfChildren() != 1) {
|
||||
m_status = Status::Error; // Unexpected number of many parameters.
|
||||
} else {
|
||||
leftHandSide = Logarithm::Builder(parameter.childAtIndex(0), base);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Expression parameters = parseFunctionParameters();
|
||||
if (m_status != Status::Progress) {
|
||||
return;
|
||||
@@ -393,10 +412,12 @@ void Parser::parseReservedFunction(Expression & leftHandSide, const Expression::
|
||||
}
|
||||
}
|
||||
|
||||
void Parser::parseSequence(Expression & leftHandSide, const char name, Token::Type leftDelimiter, Token::Type rightDelimiter) {
|
||||
if (!popTokenIfType(leftDelimiter)) {
|
||||
void Parser::parseSequence(Expression & leftHandSide, const char name, Token::Type leftDelimiter1, Token::Type rightDelimiter1, Token::Type leftDelimiter2, Token::Type rightDelimiter2) {
|
||||
bool delimiterTypeIsOne = popTokenIfType(leftDelimiter1);
|
||||
if (!delimiterTypeIsOne && !popTokenIfType(leftDelimiter2)) {
|
||||
m_status = Status::Error; // Left delimiter missing.
|
||||
} else {
|
||||
Token::Type rightDelimiter = delimiterTypeIsOne ? rightDelimiter1 : rightDelimiter2;
|
||||
Expression rank = parseUntil(rightDelimiter);
|
||||
if (m_status != Status::Progress) {
|
||||
} else if (!popTokenIfType(rightDelimiter)) {
|
||||
@@ -424,32 +445,14 @@ void Parser::parseSpecialIdentifier(Expression & leftHandSide) {
|
||||
leftHandSide = Undefined::Builder();
|
||||
} else if (m_currentToken.compareTo(Unreal::Name()) == 0) {
|
||||
leftHandSide = Unreal::Builder();
|
||||
} else if (m_currentToken.compareTo("u_") == 0 || m_currentToken.compareTo("v_") == 0 || m_currentToken.compareTo("w_") == 0) { // Special case for sequences (e.g. "u_{n}")
|
||||
/* We now that m_currentToken.text()[0] is either 'u' or 'v', so we do not
|
||||
* need to pass a code point to parseSequence. */
|
||||
parseSequence(leftHandSide, m_currentToken.text()[0], Token::LeftBrace, Token::RightBrace);
|
||||
} else if (m_currentToken.compareTo("u") == 0 || m_currentToken.compareTo("v") == 0|| m_currentToken.compareTo("w") == 0) { // Special case for sequences (e.g. "u(n)")
|
||||
/* We now that m_currentToken.text()[0] is either 'u' or 'v', so we do not
|
||||
* need to pass a code point to parseSequence. */
|
||||
parseSequence(leftHandSide, m_currentToken.text()[0], Token::LeftParenthesis, Token::RightParenthesis);
|
||||
} else if (m_currentToken.compareTo("log_") == 0) { // Special case for the log function (e.g. "log_{2}(8)")
|
||||
if (!popTokenIfType(Token::LeftBrace)) {
|
||||
m_status = Status::Error; // Left brace missing.
|
||||
} else {
|
||||
Expression base = parseUntil(Token::RightBrace);
|
||||
if (m_status != Status::Progress) {
|
||||
} else if (!popTokenIfType(Token::RightBrace)) {
|
||||
m_status = Status::Error; // Right brace missing.
|
||||
} else {
|
||||
Expression parameter = parseFunctionParameters();
|
||||
if (m_status != Status::Progress) {
|
||||
} else if (parameter.numberOfChildren() != 1) {
|
||||
m_status = Status::Error; // Unexpected number of many parameters.
|
||||
} else {
|
||||
leftHandSide = Logarithm::Builder(parameter.childAtIndex(0), base);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (m_currentToken.compareTo("u") == 0
|
||||
|| m_currentToken.compareTo("v") == 0
|
||||
|| m_currentToken.compareTo("w") == 0)
|
||||
{
|
||||
/* Special case for sequences (e.g. "u(n)", "u{n}", ...)
|
||||
* We know that m_currentToken.text()[0] is either 'u', 'v' or 'w', so we do
|
||||
* not need to pass a code point to parseSequence. */
|
||||
parseSequence(leftHandSide, m_currentToken.text()[0], Token::LeftParenthesis, Token::RightParenthesis, Token::LeftBrace, Token::RightBrace);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ private:
|
||||
Expression parseCommaSeparatedList();
|
||||
void parseReservedFunction(Expression & leftHandSide, const Expression::FunctionHelper * const * functionHelper);
|
||||
void parseSpecialIdentifier(Expression & leftHandSide);
|
||||
void parseSequence(Expression & leftHandSide, const char name, Token::Type leftDelimiter, Token::Type rightDelimiter);
|
||||
void parseSequence(Expression & leftHandSide, const char name, Token::Type leftDelimiter1, Token::Type rightDelimiter1, Token::Type leftDelimiter2, Token::Type rightDelimiter2);
|
||||
void parseCustomIdentifier(Expression & leftHandSide, const char * name, size_t length, bool symbolPlusParenthesesAreFunctions);
|
||||
void defaultParseLeftParenthesis(bool isSystemParenthesis, Expression & leftHandSide, Token::Type stoppingType);
|
||||
|
||||
|
||||
@@ -156,11 +156,9 @@ int VerticalOffsetLayoutNode::serialize(char * buffer, int bufferSize, Preferenc
|
||||
if (bufferSize == 1) {
|
||||
return 0;
|
||||
}
|
||||
// If the layout is a subscript, write "_{indice}"
|
||||
int numberOfChar = SerializationHelper::CodePoint(buffer, bufferSize, '_');
|
||||
if (numberOfChar >= bufferSize-1) { return bufferSize-1; }
|
||||
|
||||
numberOfChar += SerializationHelper::CodePoint(buffer+numberOfChar, bufferSize-numberOfChar, '{');
|
||||
// If the layout is a subscript, write "{indice}"
|
||||
int numberOfChar = SerializationHelper::CodePoint(buffer, bufferSize, '{');
|
||||
if (numberOfChar >= bufferSize-1) { return bufferSize-1; }
|
||||
|
||||
numberOfChar += const_cast<VerticalOffsetLayoutNode *>(this)->indiceLayout()->serialize(buffer+numberOfChar, bufferSize-numberOfChar, floatDisplayMode, numberOfSignificantDigits);
|
||||
|
||||
@@ -385,7 +385,7 @@ QUIZ_CASE(poincare_parsing_identifiers) {
|
||||
assert_parsed_expression_is("ln(1)", NaperianLogarithm::Builder(BasedInteger::Builder(1)));
|
||||
assert_parsed_expression_is("log(1)", CommonLogarithm::Builder(BasedInteger::Builder(1)));
|
||||
assert_parsed_expression_is("log(1,2)", Logarithm::Builder(BasedInteger::Builder(1),BasedInteger::Builder(2)));
|
||||
assert_parsed_expression_is("log_{2}(1)", Logarithm::Builder(BasedInteger::Builder(1),BasedInteger::Builder(2)));
|
||||
assert_parsed_expression_is("log{2}(1)", Logarithm::Builder(BasedInteger::Builder(1),BasedInteger::Builder(2)));
|
||||
assert_parsed_expression_is("permute(2,1)", PermuteCoefficient::Builder(BasedInteger::Builder(2),BasedInteger::Builder(1)));
|
||||
assert_parsed_expression_is("prediction95(1,2)", PredictionInterval::Builder(BasedInteger::Builder(1),BasedInteger::Builder(2)));
|
||||
assert_parsed_expression_is("prediction(1,2)", SimplePredictionInterval::Builder(BasedInteger::Builder(1),BasedInteger::Builder(2)));
|
||||
|
||||
@@ -1025,10 +1025,10 @@ QUIZ_CASE(poincare_simplification_unit_convert) {
|
||||
assert_parsed_expression_simplify_to("1→u(n+1)", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→v(n)", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→v(n+1)", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→u_{n}", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→u_{n+1}", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→v_{n}", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→v_{n+1}", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→u{n}", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→u{n+1}", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→v{n}", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→v{n+1}", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→inf", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→undef", Undefined::Name());
|
||||
assert_parsed_expression_simplify_to("1→π", Undefined::Name());
|
||||
|
||||
Reference in New Issue
Block a user