diff --git a/grammars/README.md b/grammars/README.md index a63198b5aeb8e..adf089af643b6 100644 --- a/grammars/README.md +++ b/grammars/README.md @@ -36,7 +36,7 @@ castle ::= ... ## Non-Terminals and Terminals -Non-terminal symbols (rule names) stand for a pattern of terminals and other non-terminals. They are required to be a dashed lowercase word, like `move`, `castle`, or `check-mate`. +Non-terminal symbols (rule names) stand for a pattern of terminals and other non-terminals. Rule names can be composed of letters (both uppercase and lowercase), numbers, dashes, and underscores. For example: `move`, `castle`, `check-mate`, `dataType`, `UPPER-CASE`, or `rule_123` are all valid non-terminal names. Terminals are actual characters ([code points](https://en.wikipedia.org/wiki/Code_point)). They can be specified as a sequence like `"1"` or `"O-O"` or as ranges like `[1-9]` or `[NBKQR]`. diff --git a/src/llama-impl.cpp b/src/llama-impl.cpp index 6ec709dd323a6..e5bd07604d643 100644 --- a/src/llama-impl.cpp +++ b/src/llama-impl.cpp @@ -122,8 +122,18 @@ static std::string gguf_data_to_str(enum gguf_type type, const void * data, int case GGUF_TYPE_INT32: return std::to_string(((const int32_t *)data)[i]); case GGUF_TYPE_UINT64: return std::to_string(((const uint64_t *)data)[i]); case GGUF_TYPE_INT64: return std::to_string(((const int64_t *)data)[i]); - case GGUF_TYPE_FLOAT32: return std::to_string(((const float *)data)[i]); - case GGUF_TYPE_FLOAT64: return std::to_string(((const double *)data)[i]); + case GGUF_TYPE_FLOAT32: { + std::ostringstream oss; + oss.imbue(std::locale::classic()); + oss << ((const float *)data)[i]; + return oss.str(); + } + case GGUF_TYPE_FLOAT64: { + std::ostringstream oss; + oss.imbue(std::locale::classic()); + oss << ((const double *)data)[i]; + return oss.str(); + } case GGUF_TYPE_BOOL: return ((const bool *)data)[i] ? "true" : "false"; default: return format("unknown type %d", type); }