diff --git a/src/lexical_analysis/mod.rs b/src/lexical_analysis/mod.rs index c2b223ac..a644f742 100644 --- a/src/lexical_analysis/mod.rs +++ b/src/lexical_analysis/mod.rs @@ -187,9 +187,20 @@ fn parse_identifier(parsing: &str) -> Option { } fn is_valid_identifier(verifying: &str) -> bool { - verifying.chars().all(is_valid_identifier_character) + let mut characters = verifying.chars(); + + let starts_valid = match characters.next() { + Some(character) => is_valid_identifier_start_character(character), + None => false, + }; + + starts_valid && characters.all(is_valid_identifier_character) } -fn is_valid_identifier_character(character: char) -> bool { +fn is_valid_identifier_start_character(character: char) -> bool { character.is_alphabetic() || character == '_' } + +fn is_valid_identifier_character(character: char) -> bool { + is_valid_identifier_start_character(character) || character.is_ascii_digit() +} diff --git a/src/tests/identifier_expression/mod.rs b/src/tests/identifier_expression/mod.rs index bd3e6c37..7b34807d 100644 --- a/src/tests/identifier_expression/mod.rs +++ b/src/tests/identifier_expression/mod.rs @@ -42,6 +42,10 @@ use super::*; case( "let is_file = FALSE; let is_directory = !is_file;\nis_directory", "identifier_expression_case_15" + ), + case( + "let x1 = 5;\nlet arg2 = 10;\nx1 + arg2", + "identifier_expression_case_16" ) )] fn identifier_expression_cases(code: &str, snapshot_name: &str) {} diff --git a/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_16_environment.snap b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_16_environment.snap new file mode 100644 index 00000000..91bf3d88 --- /dev/null +++ b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_16_environment.snap @@ -0,0 +1,17 @@ +--- +source: src/tests/identifier_expression/mod.rs +expression: evaluator +--- +Evaluator { + environment: Environment { + variables: { + "arg2": Integer { + value: 10, + }, + "x1": Integer { + value: 5, + }, + }, + sub_environment: None, + }, +} diff --git a/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_16_evaluation.snap b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_16_evaluation.snap new file mode 100644 index 00000000..8b824dbc --- /dev/null +++ b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_16_evaluation.snap @@ -0,0 +1,7 @@ +--- +source: src/tests/identifier_expression/mod.rs +expression: evaluation +--- +Integer { + value: 15, +} diff --git a/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_16_lexical_analysis.snap b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_16_lexical_analysis.snap new file mode 100644 index 00000000..b9abd24d --- /dev/null +++ b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_16_lexical_analysis.snap @@ -0,0 +1,31 @@ +--- +source: src/tests/identifier_expression/mod.rs +expression: tokens +--- +[ + Let, + Identifier { + literal: "x1", + }, + Assign, + Integer { + literal: 5, + }, + SemiColon, + Let, + Identifier { + literal: "arg2", + }, + Assign, + Integer { + literal: 10, + }, + SemiColon, + Identifier { + literal: "x1", + }, + Plus, + Identifier { + literal: "arg2", + }, +] diff --git a/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_16_syntax_analysis.snap b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_16_syntax_analysis.snap new file mode 100644 index 00000000..df6b14cd --- /dev/null +++ b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_16_syntax_analysis.snap @@ -0,0 +1,33 @@ +--- +source: src/tests/identifier_expression/mod.rs +expression: abstract_syntax_tree +--- +[ + Statement { + statement: Let { + identifier: "x1", + expression: Integer { + literal: 5, + }, + }, + }, + Statement { + statement: Let { + identifier: "arg2", + expression: Integer { + literal: 10, + }, + }, + }, + Expression { + expression: Infix { + left_hand: Identifier { + identifier: "x1", + }, + operator: Plus, + right_hand: Identifier { + identifier: "arg2", + }, + }, + }, +]