Stage 5 minus missing return support

This commit is contained in:
2026-02-11 11:55:16 -05:00
parent e08bb2ff95
commit 62c1d980f7
4 changed files with 1790 additions and 872 deletions

View File

@@ -1,5 +1,65 @@
import Foundation import Foundation
@main
struct rxcc {
var variables: Dictionary<String, Int> = [:]
var stackIndex: Int = 0
static func main() {
var compiler = rxcc()
compiler.initialize()
}
mutating func initialize() {
if CommandLine.arguments.count < 2 {
for testFile in getTestFiles() {
print("Testing \(testFile.valid ? "valid" : "invalid") file \(testFile.name):")
print(testFile.contents)
variables = [:]
stackIndex = 0
let lexed: [Substring] = lex(string: testFile.contents)
let output: String = parse(lexed: lexed)
if output.isEmpty {
print()
continue
}
do {
try output.write(to: URL(fileURLWithPath: "bin").appendingPathComponent("\(testFile.name.dropLast())s"), atomically: true, encoding: .utf8)
} catch {
print("Couldn't write file \"\(testFile.name.dropLast())s\"")
}
print()
}
} else {
var text = ""
do {
text = try String(contentsOf: URL(fileURLWithPath: CommandLine.arguments[1]), encoding: .utf8)
} catch {
print("Error reading file from command line argument")
}
print(CommandLine.arguments)
let lexed: [Substring] = lex(string: text)
let output: String = parse(lexed: lexed)
if output.isEmpty {
print("Failed to compile")
}
var fileName = String(CommandLine.arguments[1].dropLast() + "s")
fileName = URL(fileURLWithPath: fileName).lastPathComponent
do {
try output.write(to: URL(fileURLWithPath: fileName), atomically: true, encoding: .utf8)
} catch {
print("Couldn't write file \"\(CommandLine.arguments[1].dropLast())s\"")
}
}
}
class SyntaxTreeNode { class SyntaxTreeNode {
var parent: SyntaxTreeNode? var parent: SyntaxTreeNode?
var children: [SyntaxTreeNode] var children: [SyntaxTreeNode]
@@ -38,6 +98,8 @@ class SyntaxTreeNode {
var text: String = "\(variant)" var text: String = "\(variant)"
if variant == .LiteralInteger { if variant == .LiteralInteger {
text += "(\(value))" text += "(\(value))"
} else if variant == .Variable {
text += "(\(value))"
} }
for child in children { for child in children {
text += "\n\(String(repeating: " ", count: level))└───\(child.text(level + 1))" text += "\n\(String(repeating: " ", count: level))└───\(child.text(level + 1))"
@@ -74,6 +136,8 @@ enum TokenType {
case GREATER_THAN case GREATER_THAN
case GREATER_THAN_OR_EQUAL_TO case GREATER_THAN_OR_EQUAL_TO
case ASSIGNMENT
case UNDEFINED case UNDEFINED
} }
@@ -85,12 +149,19 @@ struct Token {
typealias Construct = [Element] typealias Construct = [Element]
enum Element { enum Element {
case Loop(type: ConstructType) case List(type: ConstructType)
case OperatorLoop(type: ConstructType)
case Construct(type: ConstructType) case Construct(type: ConstructType)
case Optional(type: TokenType)
case Token(type: TokenType) case Token(type: TokenType)
} }
enum ConstructVariant { enum ConstructVariant {
case Variable
case StandaloneVariable
case IntegerVariableDeclaration
case VariableAssignment
case Addition case Addition
case Subtraction case Subtraction
case Multiplication case Multiplication
@@ -118,6 +189,8 @@ enum ConstructVariant {
case RelationalExpressionSequence case RelationalExpressionSequence
case EqualityExpressionSequence case EqualityExpressionSequence
case LogicalAndExpressionSequence case LogicalAndExpressionSequence
case LogicalOrExpressionSequence
case VariableExpression
// Term variants // Term variants
case FactorSequence case FactorSequence
@@ -128,7 +201,11 @@ enum ConstructVariant {
case ParenthesizedExpression case ParenthesizedExpression
// Statement variants // Statement variants
case ReturnInteger case StatementSequence
case ReturnExpression
case DeclareVariable
case StandaloneExpression
// Function Variants // Function Variants
case Integer case Integer
@@ -142,6 +219,10 @@ enum ConstructVariant {
} }
enum ConstructType { enum ConstructType {
case VariableFactor
case VariableDeclaration
case VariableAssignment
case UnaryOperator case UnaryOperator
case MultiplicationPriorityOperator case MultiplicationPriorityOperator
@@ -153,8 +234,10 @@ enum ConstructType {
case Program case Program
case Function case Function
case StatementList
case Statement case Statement
case Expression case Expression
case LogicalOrExpression
case LogicalAndExpression case LogicalAndExpression
case EqualityExpression case EqualityExpression
case RelationalExpression case RelationalExpression
@@ -169,6 +252,26 @@ struct ConstructDefinitions {
} }
let constructDefinitions: Dictionary<ConstructType, Dictionary<ConstructVariant, Construct>> = [ let constructDefinitions: Dictionary<ConstructType, Dictionary<ConstructVariant, Construct>> = [
.VariableFactor: [
.Variable: [
.Token(type: .IDENTIFIER),
],
],
.VariableDeclaration: [
.Variable: [
.Token(type: .INT),
.Token(type: .IDENTIFIER),
.Optional(type: .ASSIGNMENT),
.Construct(type: .Expression),
],
],
.VariableAssignment: [
.Variable: [
.Token(type: .IDENTIFIER),
.Token(type: .ASSIGNMENT),
.Construct(type: .Expression),
],
],
.UnaryOperator: [ .UnaryOperator: [
.Negation: [ .Negation: [
.Token(type: .NEGATION), .Token(type: .NEGATION),
@@ -237,37 +340,46 @@ let constructDefinitions: Dictionary<ConstructType, Dictionary<ConstructVariant,
// Expressions // Expressions
.Expression: [ .Expression: [
.VariableExpression: [
.Construct(type: .VariableAssignment)
],
.LogicalOrExpressionSequence: [
.Construct(type: .LogicalOrExpression)
],
],
.LogicalOrExpression: [
.LogicalAndExpressionSequence: [ .LogicalAndExpressionSequence: [
.Construct(type: .LogicalAndExpression), .Construct(type: .LogicalAndExpression),
.Loop(type: .LogicalOrPriorityOperator), .OperatorLoop(type: .LogicalOrPriorityOperator),
] ]
], ],
.LogicalAndExpression: [ .LogicalAndExpression: [
.EqualityExpressionSequence: [ .EqualityExpressionSequence: [
.Construct(type: .EqualityExpression), .Construct(type: .EqualityExpression),
.Loop(type: .LogicalAndPriorityOperator), .OperatorLoop(type: .LogicalAndPriorityOperator),
] ]
], ],
.EqualityExpression: [ .EqualityExpression: [
.RelationalExpressionSequence: [ .RelationalExpressionSequence: [
.Construct(type: .RelationalExpression), .Construct(type: .RelationalExpression),
.Loop(type: .EqualityPriorityOperator), .OperatorLoop(type: .EqualityPriorityOperator),
] ]
], ],
.RelationalExpression: [ .RelationalExpression: [
.AdditiveExpressionSequence: [ .AdditiveExpressionSequence: [
.Construct(type: .AdditiveExpression), .Construct(type: .AdditiveExpression),
.Loop(type: .InequalityPriorityOperator), .OperatorLoop(type: .InequalityPriorityOperator),
] ]
], ],
.AdditiveExpression: [ .AdditiveExpression: [
.TermSequence: [ .TermSequence: [
.Construct(type: .Term), .Construct(type: .Term),
.Loop(type: .AdditionPriorityOperator), .OperatorLoop(type: .AdditionPriorityOperator),
] ]
], ],
@@ -275,7 +387,7 @@ let constructDefinitions: Dictionary<ConstructType, Dictionary<ConstructVariant,
.Term: [ .Term: [
.FactorSequence: [ .FactorSequence: [
.Construct(type: .Factor), .Construct(type: .Factor),
.Loop(type: .MultiplicationPriorityOperator), .OperatorLoop(type: .MultiplicationPriorityOperator),
] ]
], ],
@@ -291,16 +403,33 @@ let constructDefinitions: Dictionary<ConstructType, Dictionary<ConstructVariant,
.Token(type: .PARENTHESIS_OPEN), .Token(type: .PARENTHESIS_OPEN),
.Construct(type: .Expression), .Construct(type: .Expression),
.Token(type: .PARENTHESIS_CLOSE) .Token(type: .PARENTHESIS_CLOSE)
],
.StandaloneVariable: [
.Construct(type: .VariableFactor)
] ]
], ],
// Super-expressions // Super-expressions
.StatementList: [
.StatementSequence: [
.List(type: .Statement)
]
],
.Statement: [ .Statement: [
.ReturnInteger: [ .ReturnExpression: [
.Token(type: .RETURN), .Token(type: .RETURN),
.Construct(type: .Expression), .Construct(type: .Expression),
.Token(type: .SEMICOLON) .Token(type: .SEMICOLON)
] ],
.StandaloneExpression: [
.Construct(type: .Expression),
.Token(type: .SEMICOLON)
],
.DeclareVariable: [
.Construct(type: .VariableDeclaration),
.Token(type: .SEMICOLON)
],
], ],
.Function: [ .Function: [
@@ -310,7 +439,7 @@ let constructDefinitions: Dictionary<ConstructType, Dictionary<ConstructVariant,
.Token(type: .PARENTHESIS_OPEN), .Token(type: .PARENTHESIS_OPEN),
.Token(type: .PARENTHESIS_CLOSE), .Token(type: .PARENTHESIS_CLOSE),
.Token(type: .BRACE_OPEN), .Token(type: .BRACE_OPEN),
.Construct(type: .Statement), .Construct(type: .StatementList),
.Token(type: .BRACE_CLOSE) .Token(type: .BRACE_CLOSE)
] ]
], ],
@@ -339,62 +468,12 @@ struct TestFile {
var valid: Bool var valid: Bool
} }
@main
struct rxcc {
static func main() {
if CommandLine.arguments.count < 2 {
for testFile in getTestFiles() {
print("Testing \(testFile.valid ? "valid" : "invalid") file \(testFile.name):")
print(testFile.contents)
let lexed: [Substring] = lex(string: testFile.contents)
let output: String = parse(lexed: lexed)
if output.isEmpty {
print()
continue
}
do {
try output.write(to: URL(fileURLWithPath: "bin").appendingPathComponent("\(testFile.name.dropLast())s"), atomically: true, encoding: .utf8)
} catch {
print("Couldn't write file \"\(testFile.name.dropLast())s\"")
}
print()
}
} else {
var text = ""
do {
text = try String(contentsOf: URL(fileURLWithPath: CommandLine.arguments[1]), encoding: .utf8)
} catch {
print("Error reading file from command line argument")
}
print(CommandLine.arguments)
let lexed: [Substring] = lex(string: text)
let output: String = parse(lexed: lexed)
if output.isEmpty {
print("Failed to compile")
}
var fileName = String(CommandLine.arguments[1].dropLast() + "s")
fileName = URL(fileURLWithPath: fileName).lastPathComponent
do {
try output.write(to: URL(fileURLWithPath: fileName), atomically: true, encoding: .utf8)
} catch {
print("Couldn't write file \"\(CommandLine.arguments[1].dropLast())s\"")
}
}
}
}
func getTestFiles() -> [TestFile] { func getTestFiles() -> [TestFile] {
var testFiles: [TestFile] = [TestFile]() var testFiles: [TestFile] = [TestFile]()
let fileManager = FileManager.default let fileManager = FileManager.default
let path = "c/tests/stage_4" let path = "c/tests/stage_5"
do { do {
let validItems = try fileManager.contentsOfDirectory(atPath: path + "/valid") let validItems = try fileManager.contentsOfDirectory(atPath: path + "/valid")
@@ -440,9 +519,11 @@ func lex(string: String) -> [Substring] {
line = line.replacing("/", with: " / ") line = line.replacing("/", with: " / ")
line = line.replacing("<", with: " < ") line = line.replacing("<", with: " < ")
line = line.replacing(">", with: " > ") line = line.replacing(">", with: " > ")
line = line.replacing("=", with: " = ")
line = line.replacing("&&", with: " && ") line = line.replacing("&&", with: " && ")
line = line.replacing("||", with: " || ") line = line.replacing("||", with: " || ")
line = line.replacing("==", with: " == ") line = line.replacing("==", with: " == ")
line = line.replacing(/= +=/, with: " == ")
line = line.replacing(/! *=/, with: " != ") line = line.replacing(/! *=/, with: " != ")
line = line.replacing(/< *=/, with: " <= ") line = line.replacing(/< *=/, with: " <= ")
line = line.replacing(/> *=/, with: " >= ") line = line.replacing(/> *=/, with: " >= ")
@@ -458,7 +539,7 @@ func lex(string: String) -> [Substring] {
return [] return []
} }
func generateOutput(_ node: SyntaxTreeNode) -> String { mutating func generateOutput(_ node: SyntaxTreeNode) -> String {
var text: String = "" var text: String = ""
switch node.variant { switch node.variant {
case .Root: case .Root:
@@ -467,12 +548,110 @@ func generateOutput(_ node: SyntaxTreeNode) -> String {
} }
break break
case .StatementSequence:
for child in node.children {
text += generateOutput(child)
}
break
case .ParenthesizedExpression: case .ParenthesizedExpression:
for child in node.children { for child in node.children {
text += generateOutput(child) text += generateOutput(child)
} }
break break
case .StandaloneVariable:
let count = node.children.count
if count != 1 {
print("ERROR: \(node.variant) with more or less than 1 child")
break
}
//text += generateOutput(node.children[0])
let variable: String = node.children[0].value
if let index = variables[variable] {
text += " movl\t\(index)(%ebp), %eax\n"
} else {
print("ERROR: \(variable) used before it was declared (in \(node.variant))")
}
break
case .DeclareVariable:
let count = node.children.count
if count != 1 {
print("ERROR: \(node.variant) with more or less than 1 child")
break
}
let variable: String = node.children[0].value
if variables.keys.contains(variable) {
print("ERROR: Redefinition of variable \"\(variable)\"")
break
}
variables.updateValue(stackIndex, forKey: variable)
stackIndex -= 4
let notInitialized: Bool = node.children[0].children.count == 0
//print("For variable \(variable), node children 0 children count == 0 : \(notInitialized)")
if notInitialized {
text += " push\t$0\n"
} else {
text += generateOutput(node.children[0])
text += " push\t%eax\n"
}
break
case .VariableExpression:
let count = node.children.count
if count != 1 {
print("ERROR: \(node.variant) with more or less than 1 child")
break
}
let variable: String = node.children[0].value
text += generateOutput(node.children[0])
text += " push\t%eax\n"
break
case .Variable:
let count = node.children.count
if count > 1 {
print("ERROR: \(node.variant) with more than 1 child")
break
}
let variable: String = node.value
if !variables.keys.contains(variable) {
print("ERROR: Variable \"\(variable)\" used before it was declared")
break
}
if count != 0 {
text += generateOutput(node.children[0])
}
text += " movl\t%eax, \(variables[variable]!)(%ebp)\n"
break
case .LogicalOrExpressionSequence:
if node.children.count != 1 {
print("Error: \(node.variant) with more or less than one child")
}
text += generateOutput(node.children[0])
break
case .StandaloneExpression:
if node.children.count != 1 {
print("Error: \(node.variant) with more or less than one child")
}
text += generateOutput(node.children[0])
break
case .LogicalAndExpressionSequence: case .LogicalAndExpressionSequence:
var operation: ConstructVariant = .Error var operation: ConstructVariant = .Error
let count = node.children.count let count = node.children.count
@@ -750,29 +929,32 @@ func generateOutput(_ node: SyntaxTreeNode) -> String {
} }
break break
/*
<CODE FOR e1 GOES HERE>
push %eax ; save value of e1 on the stack
<CODE FOR e2 GOES HERE>
pop %ecx ; pop e1 from the stack into ecx
addl %ecx, %eax ; add e1 to e2, save results in eax
*/
case .Integer: case .Integer:
text += " .globl \(node.value)\n\(node.value):\n" text += """
.globl \(node.value)
\(node.value):
push\t%ebp
movl\t%esp, %ebp
"""
for child in node.children { for child in node.children {
text += generateOutput(child) text += generateOutput(child)
} }
break break
case .ReturnInteger: case .ReturnExpression:
if node.children.count != 1 { if node.children.count != 1 {
print("\(node.variant) cannot have more than one child node") print("\(node.variant) cannot have more than one child node")
return "[ERROR]" return "[ERROR]"
} }
text += generateOutput(node.children[0]) text += generateOutput(node.children[0])
text += " ret\n" text += """
movl\t%ebp, %esp
pop \t%ebp
ret\n
"""
break break
case .UnaryOperation: case .UnaryOperation:
@@ -812,7 +994,7 @@ func generateOutput(_ node: SyntaxTreeNode) -> String {
return text return text
} }
func parse(lexed: [Substring]) -> String { mutating func parse(lexed: [Substring]) -> String {
var tokens: [Token] = [Token]() var tokens: [Token] = [Token]()
for token: Substring in lexed { for token: Substring in lexed {
let tokenType: TokenType = categorizeToken(token: token) let tokenType: TokenType = categorizeToken(token: token)
@@ -858,7 +1040,7 @@ func validateConstruct(type: ConstructType, variant: ConstructVariant, tokens: i
let construct = constructDefinitions[type]![variant]! let construct = constructDefinitions[type]![variant]!
for element in construct { for element in construct {
switch element { switch element {
case .Loop(let constructType): case .OperatorLoop(let constructType):
var valid: Validity = .Invalid var valid: Validity = .Invalid
var matchingOperator: Bool = false var matchingOperator: Bool = false
print("\(indent)Determining need to loop construct of type \(constructType)") print("\(indent)Determining need to loop construct of type \(constructType)")
@@ -867,7 +1049,13 @@ func validateConstruct(type: ConstructType, variant: ConstructVariant, tokens: i
let childNode = node.addChild(value: constructVariant) let childNode = node.addChild(value: constructVariant)
print("\(indent)Testing operator \(constructType)::\(constructVariant)") print("\(indent)Testing operator \(constructType)::\(constructVariant)")
valid = validateConstruct(type: constructType, variant: constructVariant, tokens: &tokens, node: childNode) valid = validateConstruct(
type: constructType,
variant: constructVariant,
tokens: &tokens,
node: childNode
)
if valid == .Panic { if valid == .Panic {
print("\(indent)Fail: panic (variant \"\(constructVariant)\"))\n") print("\(indent)Fail: panic (variant \"\(constructVariant)\"))\n")
return .Invalid return .Invalid
@@ -876,6 +1064,7 @@ func validateConstruct(type: ConstructType, variant: ConstructVariant, tokens: i
_ = node.popLastChild() _ = node.popLastChild()
continue continue
} }
matchingOperator = true matchingOperator = true
break break
} }
@@ -889,13 +1078,42 @@ func validateConstruct(type: ConstructType, variant: ConstructVariant, tokens: i
break break
} }
case .Optional(let tokenType):
print("\(indent)Determining need to continue. (Testing\(tokenType))")
let tokenBackup: [Token] = tokens
if let token: Token = tokens.popLast() {
if token.type == tokenType {
print("\(indent)\(tokenType) validated. Continuing")
continue
} else {
print("\(indent)\(tokenType) NOT validated. Breaking")
tokens = tokenBackup
return .Valid
}
} else {
print("No more tokens")
return .Invalid
}
case .Construct(let type): case .Construct(let type):
print("\(indent)Begin validate subconstruct (type \"\(type)\")") print("\(indent)Begin validate subconstruct (type \"\(type)\")")
var valid: Validity = .Invalid var valid: Validity = .Invalid
var validVariant: ConstructVariant = .Error var validVariant: ConstructVariant = .Error
let tokenBackup: [Token] = tokens let tokenBackup: [Token] = tokens
for variant in constructDefinitions[type]!.keys {
var constructVariants = Array(constructDefinitions[type]!.keys)
if constructVariants.contains(.VariableExpression) {
let index: Int = constructVariants.firstIndex(of: .VariableExpression)!
let atZero: ConstructVariant = constructVariants[0]
constructVariants[0] = constructVariants[index]
constructVariants[index] = atZero
print("\(indent)Put VariableExpression at the start of the array")
}
for variant in constructVariants {
let childNode = node.addChild(value: variant) let childNode = node.addChild(value: variant)
var loopable = false var loopable = false
if variant == .FactorSequence || variant == .TermSequence { if variant == .FactorSequence || variant == .TermSequence {
@@ -903,7 +1121,13 @@ func validateConstruct(type: ConstructType, variant: ConstructVariant, tokens: i
} }
print("\(indent)Testing variant \(variant) (Loop = \(loop)) (Loopable = \(loopable))") print("\(indent)Testing variant \(variant) (Loop = \(loop)) (Loopable = \(loopable))")
valid = validateConstruct(type: type, variant: variant, tokens: &tokens, node: childNode) valid = validateConstruct(
type: type,
variant: variant,
tokens: &tokens,
node: childNode
)
if valid == .Panic { if valid == .Panic {
print("\(indent)Fail: panic (variant \"\(variant)\"))\n") print("\(indent)Fail: panic (variant \"\(variant)\"))\n")
return .Invalid return .Invalid
@@ -913,6 +1137,7 @@ func validateConstruct(type: ConstructType, variant: ConstructVariant, tokens: i
_ = node.popLastChild() _ = node.popLastChild()
continue continue
} }
print("\(indent)Success (variant \"\(variant)\")\n") print("\(indent)Success (variant \"\(variant)\")\n")
validVariant = variant validVariant = variant
@@ -931,11 +1156,63 @@ func validateConstruct(type: ConstructType, variant: ConstructVariant, tokens: i
print("\(indent)End validate subconstruct (variant \"\(validVariant)\")") print("\(indent)End validate subconstruct (variant \"\(validVariant)\")")
continue continue
case .List(let constructType):
var valid: Validity = .Invalid
var matching: Bool = false
print("\(indent)Determining need to loop construct of type \(constructType)")
let tokenBackup: [Token] = tokens
var constructVariants = Array(constructDefinitions[constructType]!.keys)
if constructVariants.contains(.VariableExpression) {
let index: Int = constructVariants.firstIndex(of: .VariableExpression)!
let atZero: ConstructVariant = constructVariants[0]
constructVariants[0] = constructVariants[index]
constructVariants[index] = atZero
print("\(indent)Put VariableExpression at the start of the array")
}
for constructVariant in constructVariants {
let childNode = node.addChild(value: constructVariant)
print("\(indent)Testing \(constructType)::\(constructVariant)")
valid = validateConstruct(
type: constructType,
variant: constructVariant,
tokens: &tokens,
node: childNode
)
if valid == .Panic {
print("\(indent)Fail: panic (variant \"\(constructVariant)\"))\n")
return .Invalid
} else if valid == .Invalid {
tokens = tokenBackup
_ = node.popLastChild()
continue
}
matching = true
break
}
loop = matching
if loop {
print("\(indent)Looping")
} else {
print("\(indent)Not looping")
break
}
case .Token(let type): case .Token(let type):
if let token: Token = tokens.popLast() { if let token: Token = tokens.popLast() {
if type != token.type { if token.type == .ASSIGNMENT && variant == .LogicalOrExpressionSequence {
print("\(indent)VALIDATION FAILED FOR TOKEN \"\(token.content)\"") print("\(indent)Cannot encounter assignment in \(variant)")
print("\(indent)AKA, \(type) not equal to \(token.type)") return .Invalid
}
else if type != token.type {
print("\(indent)Failed to validate token \"\(token.content)\". Expected \"\(type)\"")
//print("\(indent)AKA, \(type) not equal to \(token.type)")
return .Invalid return .Invalid
} }
print("\(indent)Validated token \"\(token.content)\"") print("\(indent)Validated token \"\(token.content)\"")
@@ -984,7 +1261,8 @@ func categorizeToken(token: Substring) -> TokenType {
else if token.firstMatch(of: /^<=$/) != nil { return .LESS_THAN_OR_EQUAL_TO } else if token.firstMatch(of: /^<=$/) != nil { return .LESS_THAN_OR_EQUAL_TO }
else if token.firstMatch(of: /^>$/) != nil { return .GREATER_THAN } else if token.firstMatch(of: /^>$/) != nil { return .GREATER_THAN }
else if token.firstMatch(of: /^>=$/) != nil { return .GREATER_THAN_OR_EQUAL_TO } else if token.firstMatch(of: /^>=$/) != nil { return .GREATER_THAN_OR_EQUAL_TO }
else if token.firstMatch(of: /^=$/) != nil { return .ASSIGNMENT }
return .UNDEFINED return .UNDEFINED
} }
}

133
one Normal file
View File

@@ -0,0 +1,133 @@
Tokens:
["int", "main", "(", ")", "{", "int", "tomas", ";", "tomas", "=", "2", ";", "return", "1", "+", "2", ";", "}"]
Begin validate subconstruct (type "Function")
Testing variant Integer (Loop = false) (Loopable = false)
Validated token "int"
Validated token "main"
Validated token "("
Validated token ")"
Validated token "{"
Begin validate subconstruct (type "StatementList")
Testing variant StatementSequence (Loop = false) (Loopable = false)
Determining need to loop construct of type Statement
Testing Statement::ReturnExpression
Failed to validate token "int". Expected "RETURN"
Testing Statement::DeclareVariable
Begin validate subconstruct (type "VariableDeclaration")
Testing variant Variable (Loop = false) (Loopable = false)
Validated token "int"
Validated token "tomas"
Determining need to continue. (TestingASSIGNMENT)
ASSIGNMENT NOT validated. Breaking
Success (variant "Variable")
End validate subconstruct (variant "Variable")
Validated token ";"
Looping
Determining need to loop construct of type Statement
Testing Statement::ReturnExpression
Failed to validate token "tomas". Expected "RETURN"
Testing Statement::DeclareVariable
Begin validate subconstruct (type "VariableDeclaration")
Testing variant Variable (Loop = false) (Loopable = false)
Failed to validate token "tomas". Expected "INT"
Fail: no valid variants (variant "Variable")
Subconstruct validation failed
Testing Statement::StandaloneExpression
Begin validate subconstruct (type "Expression")
Testing variant LogicalOrExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "LogicalOrExpression")
Testing variant LogicalAndExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "LogicalAndExpression")
Testing variant EqualityExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "EqualityExpression")
Testing variant RelationalExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "RelationalExpression")
Testing variant AdditiveExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "AdditiveExpression")
Testing variant TermSequence (Loop = false) (Loopable = true)
Begin validate subconstruct (type "Term")
Testing variant FactorSequence (Loop = false) (Loopable = true)
Begin validate subconstruct (type "Factor")
Testing variant LiteralInteger (Loop = false) (Loopable = false)
Failed to validate token "tomas". Expected "LITERAL_INTEGER"
Fail: no valid variants (variant "LiteralInteger")
Testing variant StandaloneVariable (Loop = false) (Loopable = false)
Begin validate subconstruct (type "VariableFactor")
Testing variant Variable (Loop = false) (Loopable = false)
Validated token "tomas"
Success (variant "Variable")
End validate subconstruct (variant "Variable")
Success (variant "StandaloneVariable")
End validate subconstruct (variant "StandaloneVariable")
Determining need to loop construct of type MultiplicationPriorityOperator
Testing operator MultiplicationPriorityOperator::Division
Failed to validate token "=". Expected "DIVISION"
Testing operator MultiplicationPriorityOperator::Multiplication
Failed to validate token "=". Expected "MULTIPLICATION"
Not looping
Success (variant "FactorSequence")
End validate subconstruct (variant "FactorSequence")
Determining need to loop construct of type AdditionPriorityOperator
Testing operator AdditionPriorityOperator::Subtraction
Failed to validate token "=". Expected "NEGATION"
Testing operator AdditionPriorityOperator::Addition
Failed to validate token "=". Expected "ADDITION"
Not looping
Success (variant "TermSequence")
End validate subconstruct (variant "TermSequence")
Determining need to loop construct of type InequalityPriorityOperator
Testing operator InequalityPriorityOperator::GreaterThanOrEqualTo
Failed to validate token "=". Expected "GREATER_THAN_OR_EQUAL_TO"
Testing operator InequalityPriorityOperator::LessThan
Failed to validate token "=". Expected "LESS_THAN"
Testing operator InequalityPriorityOperator::LessThanOrEqualTo
Failed to validate token "=". Expected "LESS_THAN_OR_EQUAL_TO"
Testing operator InequalityPriorityOperator::GreaterThan
Failed to validate token "=". Expected "GREATER_THAN"
Not looping
Success (variant "AdditiveExpressionSequence")
End validate subconstruct (variant "AdditiveExpressionSequence")
Determining need to loop construct of type EqualityPriorityOperator
Testing operator EqualityPriorityOperator::EqualTo
Failed to validate token "=". Expected "EQUAL"
Testing operator EqualityPriorityOperator::NotEqualTo
Failed to validate token "=". Expected "NOT_EQUAL"
Not looping
Success (variant "RelationalExpressionSequence")
End validate subconstruct (variant "RelationalExpressionSequence")
Determining need to loop construct of type LogicalAndPriorityOperator
Testing operator LogicalAndPriorityOperator::LogicalAnd
Failed to validate token "=". Expected "LOGICAL_AND"
Not looping
Success (variant "EqualityExpressionSequence")
End validate subconstruct (variant "EqualityExpressionSequence")
Determining need to loop construct of type LogicalOrPriorityOperator
Testing operator LogicalOrPriorityOperator::LogicalOr
Failed to validate token "=". Expected "LOGICAL_OR"
Not looping
Success (variant "LogicalAndExpressionSequence")
End validate subconstruct (variant "LogicalAndExpressionSequence")
Success (variant "LogicalOrExpressionSequence")
End validate subconstruct (variant "LogicalOrExpressionSequence")
Failed to validate token "=". Expected "SEMICOLON"
Not looping
Success (variant "StatementSequence")
End validate subconstruct (variant "StatementSequence")
Failed to validate token "tomas". Expected "BRACE_CLOSE"
Fail: no valid variants (variant "Integer")
Subconstruct validation failed
Distinct lack of success

2
test.c
View File

@@ -1,4 +1,4 @@
int main() { int main() {
return 1 || 0 && 2;
} }

507
two Normal file
View File

@@ -0,0 +1,507 @@
Tokens:
["int", "main", "(", ")", "{", "int", "tomas", ";", "tomas", "=", "2", ";", "return", "1", "+", "2", ";", "}"]
Begin validate subconstruct (type "Function")
Testing variant Integer (Loop = false) (Loopable = false)
Validated token "int"
Validated token "main"
Validated token "("
Validated token ")"
Validated token "{"
Begin validate subconstruct (type "StatementList")
Testing variant StatementSequence (Loop = false) (Loopable = false)
Determining need to loop construct of type Statement
Testing Statement::StandaloneExpression
Begin validate subconstruct (type "Expression")
Testing variant VariableExpression (Loop = false) (Loopable = false)
Begin validate subconstruct (type "VariableAssignment")
Testing variant Variable (Loop = false) (Loopable = false)
Failed to validate token "int". Expected "IDENTIFIER"
Fail: no valid variants (variant "Variable")
Subconstruct validation failed
Fail: no valid variants (variant "VariableExpression")
Testing variant LogicalOrExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "LogicalOrExpression")
Testing variant LogicalAndExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "LogicalAndExpression")
Testing variant EqualityExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "EqualityExpression")
Testing variant RelationalExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "RelationalExpression")
Testing variant AdditiveExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "AdditiveExpression")
Testing variant TermSequence (Loop = false) (Loopable = true)
Begin validate subconstruct (type "Term")
Testing variant FactorSequence (Loop = false) (Loopable = true)
Begin validate subconstruct (type "Factor")
Testing variant LiteralInteger (Loop = false) (Loopable = false)
Failed to validate token "int". Expected "LITERAL_INTEGER"
Fail: no valid variants (variant "LiteralInteger")
Testing variant ParenthesizedExpression (Loop = false) (Loopable = false)
Failed to validate token "int". Expected "PARENTHESIS_OPEN"
Fail: no valid variants (variant "ParenthesizedExpression")
Testing variant StandaloneVariable (Loop = false) (Loopable = false)
Begin validate subconstruct (type "VariableFactor")
Testing variant Variable (Loop = false) (Loopable = false)
Failed to validate token "int". Expected "IDENTIFIER"
Fail: no valid variants (variant "Variable")
Subconstruct validation failed
Fail: no valid variants (variant "StandaloneVariable")
Testing variant UnaryOperation (Loop = false) (Loopable = false)
Begin validate subconstruct (type "UnaryOperator")
Testing variant LogicalNegation (Loop = false) (Loopable = false)
Failed to validate token "int". Expected "LOGICAL_NEGATION"
Fail: no valid variants (variant "LogicalNegation")
Testing variant BitwiseCompliment (Loop = false) (Loopable = false)
Failed to validate token "int". Expected "BITWISE_COMPLIMENT"
Fail: no valid variants (variant "BitwiseCompliment")
Testing variant Negation (Loop = false) (Loopable = false)
Failed to validate token "int". Expected "NEGATION"
Fail: no valid variants (variant "Negation")
Subconstruct validation failed
Fail: no valid variants (variant "UnaryOperation")
Subconstruct validation failed
Fail: no valid variants (variant "FactorSequence")
Subconstruct validation failed
Fail: no valid variants (variant "TermSequence")
Subconstruct validation failed
Fail: no valid variants (variant "AdditiveExpressionSequence")
Subconstruct validation failed
Fail: no valid variants (variant "RelationalExpressionSequence")
Subconstruct validation failed
Fail: no valid variants (variant "EqualityExpressionSequence")
Subconstruct validation failed
Fail: no valid variants (variant "LogicalAndExpressionSequence")
Subconstruct validation failed
Fail: no valid variants (variant "LogicalOrExpressionSequence")
Subconstruct validation failed
Testing Statement::DeclareVariable
Begin validate subconstruct (type "VariableDeclaration")
Testing variant Variable (Loop = false) (Loopable = false)
Validated token "int"
Validated token "tomas"
Determining need to continue. (TestingASSIGNMENT)
ASSIGNMENT NOT validated. Breaking
Success (variant "Variable")
End validate subconstruct (variant "Variable")
Validated token ";"
Looping
Determining need to loop construct of type Statement
Testing Statement::StandaloneExpression
Begin validate subconstruct (type "Expression")
Testing variant VariableExpression (Loop = false) (Loopable = false)
Begin validate subconstruct (type "VariableAssignment")
Testing variant Variable (Loop = false) (Loopable = false)
Validated token "tomas"
Validated token "="
Begin validate subconstruct (type "Expression")
Testing variant VariableExpression (Loop = false) (Loopable = false)
Begin validate subconstruct (type "VariableAssignment")
Testing variant Variable (Loop = false) (Loopable = false)
Failed to validate token "2". Expected "IDENTIFIER"
Fail: no valid variants (variant "Variable")
Subconstruct validation failed
Fail: no valid variants (variant "VariableExpression")
Testing variant LogicalOrExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "LogicalOrExpression")
Testing variant LogicalAndExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "LogicalAndExpression")
Testing variant EqualityExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "EqualityExpression")
Testing variant RelationalExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "RelationalExpression")
Testing variant AdditiveExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "AdditiveExpression")
Testing variant TermSequence (Loop = false) (Loopable = true)
Begin validate subconstruct (type "Term")
Testing variant FactorSequence (Loop = false) (Loopable = true)
Begin validate subconstruct (type "Factor")
Testing variant LiteralInteger (Loop = false) (Loopable = false)
Validated token "2"
Success (variant "LiteralInteger")
End validate subconstruct (variant "LiteralInteger")
Determining need to loop construct of type MultiplicationPriorityOperator
Testing operator MultiplicationPriorityOperator::Division
Failed to validate token ";". Expected "DIVISION"
Testing operator MultiplicationPriorityOperator::Multiplication
Failed to validate token ";". Expected "MULTIPLICATION"
Not looping
Success (variant "FactorSequence")
End validate subconstruct (variant "FactorSequence")
Determining need to loop construct of type AdditionPriorityOperator
Testing operator AdditionPriorityOperator::Addition
Failed to validate token ";". Expected "ADDITION"
Testing operator AdditionPriorityOperator::Subtraction
Failed to validate token ";". Expected "NEGATION"
Not looping
Success (variant "TermSequence")
End validate subconstruct (variant "TermSequence")
Determining need to loop construct of type InequalityPriorityOperator
Testing operator InequalityPriorityOperator::LessThan
Failed to validate token ";". Expected "LESS_THAN"
Testing operator InequalityPriorityOperator::GreaterThanOrEqualTo
Failed to validate token ";". Expected "GREATER_THAN_OR_EQUAL_TO"
Testing operator InequalityPriorityOperator::LessThanOrEqualTo
Failed to validate token ";". Expected "LESS_THAN_OR_EQUAL_TO"
Testing operator InequalityPriorityOperator::GreaterThan
Failed to validate token ";". Expected "GREATER_THAN"
Not looping
Success (variant "AdditiveExpressionSequence")
End validate subconstruct (variant "AdditiveExpressionSequence")
Determining need to loop construct of type EqualityPriorityOperator
Testing operator EqualityPriorityOperator::EqualTo
Failed to validate token ";". Expected "EQUAL"
Testing operator EqualityPriorityOperator::NotEqualTo
Failed to validate token ";". Expected "NOT_EQUAL"
Not looping
Success (variant "RelationalExpressionSequence")
End validate subconstruct (variant "RelationalExpressionSequence")
Determining need to loop construct of type LogicalAndPriorityOperator
Testing operator LogicalAndPriorityOperator::LogicalAnd
Failed to validate token ";". Expected "LOGICAL_AND"
Not looping
Success (variant "EqualityExpressionSequence")
End validate subconstruct (variant "EqualityExpressionSequence")
Determining need to loop construct of type LogicalOrPriorityOperator
Testing operator LogicalOrPriorityOperator::LogicalOr
Failed to validate token ";". Expected "LOGICAL_OR"
Not looping
Success (variant "LogicalAndExpressionSequence")
End validate subconstruct (variant "LogicalAndExpressionSequence")
Success (variant "LogicalOrExpressionSequence")
End validate subconstruct (variant "LogicalOrExpressionSequence")
Success (variant "Variable")
End validate subconstruct (variant "Variable")
Success (variant "VariableExpression")
End validate subconstruct (variant "VariableExpression")
Validated token ";"
Looping
Determining need to loop construct of type Statement
Testing Statement::StandaloneExpression
Begin validate subconstruct (type "Expression")
Testing variant VariableExpression (Loop = false) (Loopable = false)
Begin validate subconstruct (type "VariableAssignment")
Testing variant Variable (Loop = false) (Loopable = false)
Failed to validate token "return". Expected "IDENTIFIER"
Fail: no valid variants (variant "Variable")
Subconstruct validation failed
Fail: no valid variants (variant "VariableExpression")
Testing variant LogicalOrExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "LogicalOrExpression")
Testing variant LogicalAndExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "LogicalAndExpression")
Testing variant EqualityExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "EqualityExpression")
Testing variant RelationalExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "RelationalExpression")
Testing variant AdditiveExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "AdditiveExpression")
Testing variant TermSequence (Loop = false) (Loopable = true)
Begin validate subconstruct (type "Term")
Testing variant FactorSequence (Loop = false) (Loopable = true)
Begin validate subconstruct (type "Factor")
Testing variant LiteralInteger (Loop = false) (Loopable = false)
Failed to validate token "return". Expected "LITERAL_INTEGER"
Fail: no valid variants (variant "LiteralInteger")
Testing variant ParenthesizedExpression (Loop = false) (Loopable = false)
Failed to validate token "return". Expected "PARENTHESIS_OPEN"
Fail: no valid variants (variant "ParenthesizedExpression")
Testing variant StandaloneVariable (Loop = false) (Loopable = false)
Begin validate subconstruct (type "VariableFactor")
Testing variant Variable (Loop = false) (Loopable = false)
Failed to validate token "return". Expected "IDENTIFIER"
Fail: no valid variants (variant "Variable")
Subconstruct validation failed
Fail: no valid variants (variant "StandaloneVariable")
Testing variant UnaryOperation (Loop = false) (Loopable = false)
Begin validate subconstruct (type "UnaryOperator")
Testing variant LogicalNegation (Loop = false) (Loopable = false)
Failed to validate token "return". Expected "LOGICAL_NEGATION"
Fail: no valid variants (variant "LogicalNegation")
Testing variant BitwiseCompliment (Loop = false) (Loopable = false)
Failed to validate token "return". Expected "BITWISE_COMPLIMENT"
Fail: no valid variants (variant "BitwiseCompliment")
Testing variant Negation (Loop = false) (Loopable = false)
Failed to validate token "return". Expected "NEGATION"
Fail: no valid variants (variant "Negation")
Subconstruct validation failed
Fail: no valid variants (variant "UnaryOperation")
Subconstruct validation failed
Fail: no valid variants (variant "FactorSequence")
Subconstruct validation failed
Fail: no valid variants (variant "TermSequence")
Subconstruct validation failed
Fail: no valid variants (variant "AdditiveExpressionSequence")
Subconstruct validation failed
Fail: no valid variants (variant "RelationalExpressionSequence")
Subconstruct validation failed
Fail: no valid variants (variant "EqualityExpressionSequence")
Subconstruct validation failed
Fail: no valid variants (variant "LogicalAndExpressionSequence")
Subconstruct validation failed
Fail: no valid variants (variant "LogicalOrExpressionSequence")
Subconstruct validation failed
Testing Statement::DeclareVariable
Begin validate subconstruct (type "VariableDeclaration")
Testing variant Variable (Loop = false) (Loopable = false)
Failed to validate token "return". Expected "INT"
Fail: no valid variants (variant "Variable")
Subconstruct validation failed
Testing Statement::ReturnExpression
Validated token "return"
Begin validate subconstruct (type "Expression")
Testing variant VariableExpression (Loop = false) (Loopable = false)
Begin validate subconstruct (type "VariableAssignment")
Testing variant Variable (Loop = false) (Loopable = false)
Failed to validate token "1". Expected "IDENTIFIER"
Fail: no valid variants (variant "Variable")
Subconstruct validation failed
Fail: no valid variants (variant "VariableExpression")
Testing variant LogicalOrExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "LogicalOrExpression")
Testing variant LogicalAndExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "LogicalAndExpression")
Testing variant EqualityExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "EqualityExpression")
Testing variant RelationalExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "RelationalExpression")
Testing variant AdditiveExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "AdditiveExpression")
Testing variant TermSequence (Loop = false) (Loopable = true)
Begin validate subconstruct (type "Term")
Testing variant FactorSequence (Loop = false) (Loopable = true)
Begin validate subconstruct (type "Factor")
Testing variant LiteralInteger (Loop = false) (Loopable = false)
Validated token "1"
Success (variant "LiteralInteger")
End validate subconstruct (variant "LiteralInteger")
Determining need to loop construct of type MultiplicationPriorityOperator
Testing operator MultiplicationPriorityOperator::Division
Failed to validate token "+". Expected "DIVISION"
Testing operator MultiplicationPriorityOperator::Multiplication
Failed to validate token "+". Expected "MULTIPLICATION"
Not looping
Success (variant "FactorSequence")
End validate subconstruct (variant "FactorSequence")
Determining need to loop construct of type AdditionPriorityOperator
Testing operator AdditionPriorityOperator::Addition
Validated token "+"
Looping
Begin validate subconstruct (type "Term")
Testing variant FactorSequence (Loop = true) (Loopable = true)
Begin validate subconstruct (type "Factor")
Testing variant LiteralInteger (Loop = false) (Loopable = false)
Validated token "2"
Success (variant "LiteralInteger")
End validate subconstruct (variant "LiteralInteger")
Determining need to loop construct of type MultiplicationPriorityOperator
Testing operator MultiplicationPriorityOperator::Division
Failed to validate token ";". Expected "DIVISION"
Testing operator MultiplicationPriorityOperator::Multiplication
Failed to validate token ";". Expected "MULTIPLICATION"
Not looping
Success (variant "FactorSequence")
End validate subconstruct (variant "FactorSequence")
Determining need to loop construct of type AdditionPriorityOperator
Testing operator AdditionPriorityOperator::Addition
Failed to validate token ";". Expected "ADDITION"
Testing operator AdditionPriorityOperator::Subtraction
Failed to validate token ";". Expected "NEGATION"
Not looping
Success (variant "TermSequence")
End validate subconstruct (variant "TermSequence")
Determining need to loop construct of type InequalityPriorityOperator
Testing operator InequalityPriorityOperator::LessThan
Failed to validate token ";". Expected "LESS_THAN"
Testing operator InequalityPriorityOperator::GreaterThanOrEqualTo
Failed to validate token ";". Expected "GREATER_THAN_OR_EQUAL_TO"
Testing operator InequalityPriorityOperator::LessThanOrEqualTo
Failed to validate token ";". Expected "LESS_THAN_OR_EQUAL_TO"
Testing operator InequalityPriorityOperator::GreaterThan
Failed to validate token ";". Expected "GREATER_THAN"
Not looping
Success (variant "AdditiveExpressionSequence")
End validate subconstruct (variant "AdditiveExpressionSequence")
Determining need to loop construct of type EqualityPriorityOperator
Testing operator EqualityPriorityOperator::EqualTo
Failed to validate token ";". Expected "EQUAL"
Testing operator EqualityPriorityOperator::NotEqualTo
Failed to validate token ";". Expected "NOT_EQUAL"
Not looping
Success (variant "RelationalExpressionSequence")
End validate subconstruct (variant "RelationalExpressionSequence")
Determining need to loop construct of type LogicalAndPriorityOperator
Testing operator LogicalAndPriorityOperator::LogicalAnd
Failed to validate token ";". Expected "LOGICAL_AND"
Not looping
Success (variant "EqualityExpressionSequence")
End validate subconstruct (variant "EqualityExpressionSequence")
Determining need to loop construct of type LogicalOrPriorityOperator
Testing operator LogicalOrPriorityOperator::LogicalOr
Failed to validate token ";". Expected "LOGICAL_OR"
Not looping
Success (variant "LogicalAndExpressionSequence")
End validate subconstruct (variant "LogicalAndExpressionSequence")
Success (variant "LogicalOrExpressionSequence")
End validate subconstruct (variant "LogicalOrExpressionSequence")
Validated token ";"
Looping
Determining need to loop construct of type Statement
Testing Statement::StandaloneExpression
Begin validate subconstruct (type "Expression")
Testing variant VariableExpression (Loop = false) (Loopable = false)
Begin validate subconstruct (type "VariableAssignment")
Testing variant Variable (Loop = false) (Loopable = false)
Failed to validate token "}". Expected "IDENTIFIER"
Fail: no valid variants (variant "Variable")
Subconstruct validation failed
Fail: no valid variants (variant "VariableExpression")
Testing variant LogicalOrExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "LogicalOrExpression")
Testing variant LogicalAndExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "LogicalAndExpression")
Testing variant EqualityExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "EqualityExpression")
Testing variant RelationalExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "RelationalExpression")
Testing variant AdditiveExpressionSequence (Loop = false) (Loopable = false)
Begin validate subconstruct (type "AdditiveExpression")
Testing variant TermSequence (Loop = false) (Loopable = true)
Begin validate subconstruct (type "Term")
Testing variant FactorSequence (Loop = false) (Loopable = true)
Begin validate subconstruct (type "Factor")
Testing variant LiteralInteger (Loop = false) (Loopable = false)
Failed to validate token "}". Expected "LITERAL_INTEGER"
Fail: no valid variants (variant "LiteralInteger")
Testing variant ParenthesizedExpression (Loop = false) (Loopable = false)
Failed to validate token "}". Expected "PARENTHESIS_OPEN"
Fail: no valid variants (variant "ParenthesizedExpression")
Testing variant StandaloneVariable (Loop = false) (Loopable = false)
Begin validate subconstruct (type "VariableFactor")
Testing variant Variable (Loop = false) (Loopable = false)
Failed to validate token "}". Expected "IDENTIFIER"
Fail: no valid variants (variant "Variable")
Subconstruct validation failed
Fail: no valid variants (variant "StandaloneVariable")
Testing variant UnaryOperation (Loop = false) (Loopable = false)
Begin validate subconstruct (type "UnaryOperator")
Testing variant LogicalNegation (Loop = false) (Loopable = false)
Failed to validate token "}". Expected "LOGICAL_NEGATION"
Fail: no valid variants (variant "LogicalNegation")
Testing variant BitwiseCompliment (Loop = false) (Loopable = false)
Failed to validate token "}". Expected "BITWISE_COMPLIMENT"
Fail: no valid variants (variant "BitwiseCompliment")
Testing variant Negation (Loop = false) (Loopable = false)
Failed to validate token "}". Expected "NEGATION"
Fail: no valid variants (variant "Negation")
Subconstruct validation failed
Fail: no valid variants (variant "UnaryOperation")
Subconstruct validation failed
Fail: no valid variants (variant "FactorSequence")
Subconstruct validation failed
Fail: no valid variants (variant "TermSequence")
Subconstruct validation failed
Fail: no valid variants (variant "AdditiveExpressionSequence")
Subconstruct validation failed
Fail: no valid variants (variant "RelationalExpressionSequence")
Subconstruct validation failed
Fail: no valid variants (variant "EqualityExpressionSequence")
Subconstruct validation failed
Fail: no valid variants (variant "LogicalAndExpressionSequence")
Subconstruct validation failed
Fail: no valid variants (variant "LogicalOrExpressionSequence")
Subconstruct validation failed
Testing Statement::DeclareVariable
Begin validate subconstruct (type "VariableDeclaration")
Testing variant Variable (Loop = false) (Loopable = false)
Failed to validate token "}". Expected "INT"
Fail: no valid variants (variant "Variable")
Subconstruct validation failed
Testing Statement::ReturnExpression
Failed to validate token "}". Expected "RETURN"
Not looping
Success (variant "StatementSequence")
End validate subconstruct (variant "StatementSequence")
Validated token "}"
Success (variant "Integer")
End validate subconstruct (variant "Integer")
Success