Initial Support For If Statements

Signed-off-by: Will Hawkins <hawkinsw@obs.cr>
This commit is contained in:
Will Hawkins
2026-02-24 04:38:05 -05:00
parent 3752dd01ab
commit a2335a01ed
9 changed files with 541 additions and 46 deletions
+13 -6
View File
@@ -28,12 +28,11 @@ extension ParserAssignmentStatement: ParseableStatement {
public static func Parse(
node: Node, inTree tree: MutableTree, withScopes scopes: LexicalScopes
) -> Result<(EvaluatableStatement?, LexicalScopes)> {
guard
let parser_assignment_statement_query = try? SwiftTreeSitter.Query(
language: p4lang,
data: String(
"(assignmentStatement (expression) @lvalue (assignment) (expression) @value)"
"(assignmentStatement (expression) @lvalue (assignment) (expression) @value) @assignment"
).data(using: String.Encoding.utf8)!)
else {
return Result.Ok((.none, scopes))
@@ -44,6 +43,7 @@ extension ParserAssignmentStatement: ParseableStatement {
return Result.Ok((.none, scopes))
}
let assignment_capture = parser_assignment_statement.captures(named: "assignment")
let lvalue_capture = parser_assignment_statement.captures(named: "lvalue")
let rvalue_capture = parser_assignment_statement.captures(named: "value")
@@ -56,8 +56,15 @@ extension ParserAssignmentStatement: ParseableStatement {
Error(withMessage: "Could not parse a parser assignment statement"))
}
let rvalue_raw = rvalue_capture[0].node
let maybe_parsed_rvalue = Expression.Parse(node: rvalue_raw, inTree: tree, withScopes: scopes)
let rvalue_node = rvalue_capture[0].node
let lvalue_node = lvalue_capture[0].node
let assignment_node = assignment_capture[0].node
if assignment_node.parent != node.parent {
return Result.Ok((.none, scopes))
}
let maybe_parsed_rvalue = Expression.Parse(node: rvalue_node, inTree: tree, withScopes: scopes)
guard case Result.Ok(let rvalue) = maybe_parsed_rvalue else {
return Result.Error(maybe_parsed_rvalue.error()!)
}
@@ -72,7 +79,7 @@ extension ParserAssignmentStatement: ParseableStatement {
return Result.Ok(
(
ParserAssignmentStatement(
withLValue: TypedIdentifier(name: lvalue_expression_raw, withType: lvalue_type),
withLValue: TypedIdentifier(name: lvalue_node.text!, withType: lvalue_type),
withValue: rvalue
), scopes
))
@@ -121,7 +128,7 @@ public struct Parser {
) -> Result<(EvaluatableStatement, LexicalScopes)> {
let statementParsers: [ParseableStatement.Type] = [
ParserAssignmentStatement.self, ExpressionStatement.self,
VariableDeclarationStatement.self,
VariableDeclarationStatement.self, ConditionalStatement.self, BlockStatement.self,
]
// Iterate through statement parsers and give each one a chance.