mirror of
https://github.com/PaddiM8/kalker.git
synced 2025-06-23 19:21:26 +02:00
Lex special symbols as one token
This commit is contained in:
parent
4db84aa441
commit
2636f51077
@ -116,6 +116,13 @@ impl<'a> Lexer<'a> {
|
|||||||
';' => build(TokenKind::Semicolon, "", span),
|
';' => build(TokenKind::Semicolon, "", span),
|
||||||
'%' => build(TokenKind::Percent, "", span),
|
'%' => build(TokenKind::Percent, "", span),
|
||||||
'\'' => build(TokenKind::Tick, "", span),
|
'\'' => build(TokenKind::Tick, "", span),
|
||||||
|
// Some of the special symbols will be lexed here,
|
||||||
|
// so that they don't merge with other symbols.
|
||||||
|
'π' => build(TokenKind::Identifier, "π", span),
|
||||||
|
'√' => build(TokenKind::Identifier, "√", span),
|
||||||
|
'τ' => build(TokenKind::Identifier, "τ", span),
|
||||||
|
'ϕ' => build(TokenKind::Identifier, "ϕ", span),
|
||||||
|
'Γ' => build(TokenKind::Identifier, "Γ", span),
|
||||||
_ => build(TokenKind::Unknown, "", span),
|
_ => build(TokenKind::Unknown, "", span),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -221,7 +228,7 @@ fn is_valid_identifier(c: Option<&char>) -> bool {
|
|||||||
if let Some(c) = c {
|
if let Some(c) = c {
|
||||||
match c {
|
match c {
|
||||||
'+' | '-' | '/' | '*' | '%' | '^' | '!' | '(' | ')' | '=' | '.' | ',' | ';' | '|'
|
'+' | '-' | '/' | '*' | '%' | '^' | '!' | '(' | ')' | '=' | '.' | ',' | ';' | '|'
|
||||||
| '⌊' | '⌋' | '⌈' | '⌉' | ']' => false,
|
| '⌊' | '⌋' | '⌈' | '⌉' | ']' | 'π' | '√' | 'τ' | 'ϕ' | 'Γ' => false,
|
||||||
_ => !c.is_digit(10),
|
_ => !c.is_digit(10),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -481,10 +481,14 @@ fn parse_identifier(context: &mut Context) -> Result<Expr, CalcError> {
|
|||||||
let identifier = Identifier::from_full_name(&advance(context).value);
|
let identifier = Identifier::from_full_name(&advance(context).value);
|
||||||
|
|
||||||
// Eg. sqrt64
|
// Eg. sqrt64
|
||||||
if match_token(context, TokenKind::Literal) {
|
if match_token(context, TokenKind::Literal)
|
||||||
|
|| peek(context).value == "π"
|
||||||
|
|| peek(context).value == "τ"
|
||||||
|
|| peek(context).value == "ϕ"
|
||||||
|
{
|
||||||
// If there is a function with this name, parse it as a function, with the next token as the argument.
|
// If there is a function with this name, parse it as a function, with the next token as the argument.
|
||||||
if context.symbol_table.contains_fn(&identifier.pure_name) {
|
if context.symbol_table.contains_fn(&identifier.pure_name) {
|
||||||
let parameter = Expr::Literal(string_to_num(&advance(context).value));
|
let parameter = parse_primary(context)?;
|
||||||
return Ok(Expr::FnCall(identifier, vec![parameter]));
|
return Ok(Expr::FnCall(identifier, vec![parameter]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user