use phoron_asm::{
lexer::{
token::{Token, TokenKind::*},
Lexer,
},
sourcefile::{SourceFile, Span},
};
use std::{error::Error, path::Path};
fn lex
(testfile: P) -> Result, Box>
where
P: AsRef + Copy,
{
let source_file = SourceFile::new(testfile.as_ref()).map_err(|err| Box::new(err))?;
let mut lexer = Lexer::new(&source_file);
let mut tokens = Vec::new();
loop {
let tok = lexer.lex().unwrap_or(Token {
kind: TEof,
span: Span::default(),
});
if tok.kind == TEof {
break;
}
tokens.push(tok);
}
Ok(tokens)
}
#[test]
fn test_lex_malign() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("Malign".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(100),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/clone".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/Object;".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/Malign.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_fields() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("FieldsDemo".to_string().to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string().to_string()),
span: Span::default(),
},
Token {
kind: TField,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TIdent("x".to_string().to_string()),
span: Span::default(),
},
Token {
kind: TIdent("I".to_string().to_string()),
span: Span::default(),
},
Token {
kind: TField,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TIdent("y".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("D".to_string()),
span: Span::default(),
},
Token {
kind: TField,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TIdent("z".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TAssign,
span: Span::default(),
},
Token {
kind: TString("Foo".to_string()),
span: Span::default(),
},
Token {
kind: TField,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TFinal,
span: Span::default(),
},
Token {
kind: TIdent("PI".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("F".to_string()),
span: Span::default(),
},
Token {
kind: TAssign,
span: Span::default(),
},
Token {
kind: TFloat(3.14159),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/FieldsDemo.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_hola_mundo() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("HolaMundo".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("Hola, Mundo!".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/HolaMundo.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_hello_world() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("HelloWorld".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("Hello, world".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/HelloWorld.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_malign_jasmin() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("MalignJasmin".to_string().to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string().to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(100),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/clone".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/Object;".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/MalignJasmin.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_privet_mir() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("PrivetMir".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("Привет, мир!".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/PrivetMir.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_areturn() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("Areturn".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("makeIntArray".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("[I".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TIload0,
span: Span::default(),
},
Token {
kind: TNewarray,
span: Span::default(),
},
Token {
kind: TIdent("int".to_string()),
span: Span::default(),
},
Token {
kind: TAreturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("Areturn/makeIntArray".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("[I".to_string()),
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/Areturn.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_create_array_of_threads() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("CreateArrayOfThreads".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TAnewarray,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Thread".to_string()),
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TInstanceof,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/Thread;".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/CreateArrayOfThreads.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_swap_top_two_items() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("SwapTopTwoItems".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TIconst1,
span: Span::default(),
},
Token {
kind: TIconst2,
span: Span::default(),
},
Token {
kind: TSwap,
span: Span::default(),
},
Token {
kind: TPop,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/SwapTopTwoItems.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_create_matrix_of_int() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("CreateMatrixOfInt".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(5),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(7),
span: Span::default(),
},
Token {
kind: TMultianewarray,
span: Span::default(),
},
Token {
kind: TIdent("[[[I".to_string()),
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TInstanceof,
span: Span::default(),
},
Token {
kind: TIdent("[[[I".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/CreateMatrixOfInt.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_count() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("Count".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TIstore2,
span: Span::default(),
},
Token {
kind: TIdent("Loop".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TIload2,
span: Span::default(),
},
Token {
kind: TIsub,
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/String/valueOf".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TAstore3,
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TAload3,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TIinc,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TInt(-1),
span: Span::default(),
},
Token {
kind: TIload2,
span: Span::default(),
},
Token {
kind: TIfne,
span: Span::default(),
},
Token {
kind: TIdent("Loop".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/Count.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_catcher() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("Catcher".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TCatch,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Exception".to_string()),
span: Span::default(),
},
Token {
kind: TFrom,
span: Span::default(),
},
Token {
kind: TIdent("Label1".to_string()),
span: Span::default(),
},
Token {
kind: TTo,
span: Span::default(),
},
Token {
kind: TIdent("Label2".to_string()),
span: Span::default(),
},
Token {
kind: TUsing,
span: Span::default(),
},
Token {
kind: TIdent("Handler".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Label1".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TNew,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Exception".to_string()),
span: Span::default(),
},
Token {
kind: TDup,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Exception/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAthrow,
span: Span::default(),
},
Token {
kind: TIdent("Label2".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIdent("Handler".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TPop,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("Exception Caught".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/Catcher.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_anewarray() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("Anewarray".to_string().to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string().to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string().to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string().to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string().to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TAnewarray,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Thread".to_string()),
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TIconst2,
span: Span::default(),
},
Token {
kind: TAnewarray,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TAstore2,
span: Span::default(),
},
Token {
kind: TAload2,
span: Span::default(),
},
Token {
kind: TIconst0,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(5),
span: Span::default(),
},
Token {
kind: TAnewarray,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/String".to_string()),
span: Span::default(),
},
Token {
kind: TAastore,
span: Span::default(),
},
Token {
kind: TAload2,
span: Span::default(),
},
Token {
kind: TIconst1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(5),
span: Span::default(),
},
Token {
kind: TAnewarray,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/String".to_string()),
span: Span::default(),
},
Token {
kind: TAastore,
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/Anewarray.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_args_to_main() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("ArgsToMain".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TArraylength,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/ArgsToMain.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_count_jasmin2() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("CountJasmin2".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TIconst0,
span: Span::default(),
},
Token {
kind: TIstore1,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAstore2,
span: Span::default(),
},
Token {
kind: TIdent("loop".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TAload2,
span: Span::default(),
},
Token {
kind: TIload1,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TIinc,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TIload,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TIficmplt,
span: Span::default(),
},
Token {
kind: TIdent("loop".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/CountJasmin2.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_add_nums_jasmin() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("AddNumsJasmin".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("addNums".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("II".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TIload0,
span: Span::default(),
},
Token {
kind: TIload1,
span: Span::default(),
},
Token {
kind: TIadd,
span: Span::default(),
},
Token {
kind: TIreturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TIconst1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(99),
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("AddNumsJasmin/addNums".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("II".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/AddNumsJasmin.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_stack_push_jasmin() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("StackPushJasmin".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(40),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TIconstm1,
span: Span::default(),
},
Token {
kind: TIconst0,
span: Span::default(),
},
Token {
kind: TIconst1,
span: Span::default(),
},
Token {
kind: TIconst2,
span: Span::default(),
},
Token {
kind: TIconst3,
span: Span::default(),
},
Token {
kind: TIconst4,
span: Span::default(),
},
Token {
kind: TIconst5,
span: Span::default(),
},
Token {
kind: TLconst0,
span: Span::default(),
},
Token {
kind: TLconst1,
span: Span::default(),
},
Token {
kind: TFconst0,
span: Span::default(),
},
Token {
kind: TFconst1,
span: Span::default(),
},
Token {
kind: TDconst0,
span: Span::default(),
},
Token {
kind: TDconst1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TSipush,
span: Span::default(),
},
Token {
kind: TInt(1000),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("Hello, world".to_string()),
span: Span::default(),
},
Token {
kind: TLdcw,
span: Span::default(),
},
Token {
kind: TString("Hola, mundo".to_string()),
span: Span::default(),
},
Token {
kind: TLdc2w,
span: Span::default(),
},
Token {
kind: TInt(12345),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/StackPushJasmin.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_factorial_goto() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("FactorialGoto".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("factorial".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TIconst1,
span: Span::default(),
},
Token {
kind: TIstore1,
span: Span::default(),
},
Token {
kind: TIconst2,
span: Span::default(),
},
Token {
kind: TIstore2,
span: Span::default(),
},
Token {
kind: TIdent("floop".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIload2,
span: Span::default(),
},
Token {
kind: TIload0,
span: Span::default(),
},
Token {
kind: TIficmpgt,
span: Span::default(),
},
Token {
kind: TIdent("back".to_string()),
span: Span::default(),
},
Token {
kind: TIload1,
span: Span::default(),
},
Token {
kind: TIload2,
span: Span::default(),
},
Token {
kind: TImul,
span: Span::default(),
},
Token {
kind: TIstore1,
span: Span::default(),
},
Token {
kind: TIinc,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TGoto,
span: Span::default(),
},
Token {
kind: TIdent("floop".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("back".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIload1,
span: Span::default(),
},
Token {
kind: TIreturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("FactorialGoto/factorial".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/FactorialGoto.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_factorial_jasmin() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("FactorialJasmin".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("factorial".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TIconst1,
span: Span::default(),
},
Token {
kind: TIstore1,
span: Span::default(),
},
Token {
kind: TIconst2,
span: Span::default(),
},
Token {
kind: TIstore2,
span: Span::default(),
},
Token {
kind: TIdent("loop".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIload2,
span: Span::default(),
},
Token {
kind: TIload1,
span: Span::default(),
},
Token {
kind: TImul,
span: Span::default(),
},
Token {
kind: TIstore1,
span: Span::default(),
},
Token {
kind: TIinc,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TIload2,
span: Span::default(),
},
Token {
kind: TIload0,
span: Span::default(),
},
Token {
kind: TIficmple,
span: Span::default(),
},
Token {
kind: TIdent("loop".to_string()),
span: Span::default(),
},
Token {
kind: TIload1,
span: Span::default(),
},
Token {
kind: TIreturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("FactorialJasmin/factorial".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/FactorialJasmin.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_check_array_type() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("CheckArrayType".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(5),
span: Span::default(),
},
Token {
kind: TNewarray,
span: Span::default(),
},
Token {
kind: TIdent("int".to_string()),
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TInstanceof,
span: Span::default(),
},
Token {
kind: TIdent("[I".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TNewarray,
span: Span::default(),
},
Token {
kind: TIdent("char".to_string()),
span: Span::default(),
},
Token {
kind: TAstore2,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAload2,
span: Span::default(),
},
Token {
kind: TInstanceof,
span: Span::default(),
},
Token {
kind: TIdent("[I".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/CheckArrayType.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_print_hello_10_times() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("PrintHello10Times".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TIconst1,
span: Span::default(),
},
Token {
kind: TIstore1,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAstore2,
span: Span::default(),
},
Token {
kind: TIdent("loop".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TAload2,
span: Span::default(),
},
Token {
kind: TIload1,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/print".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload2,
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString(" - ".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/print".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload2,
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("Hello".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TIinc,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TIload1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TIficmple,
span: Span::default(),
},
Token {
kind: TIdent("loop".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/PrintHello10Times.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_add_nums() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("AddNums".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(5),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(8),
span: Span::default(),
},
Token {
kind: TNew,
span: Span::default(),
},
Token {
kind: TIdent("java/util/Scanner".to_string()),
span: Span::default(),
},
Token {
kind: TDup,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/in".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/InputStream;".to_string()),
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/util/Scanner/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/InputStream;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TJsr,
span: Span::default(),
},
Token {
kind: TIdent("ReadNum".to_string()),
span: Span::default(),
},
Token {
kind: TIstore3,
span: Span::default(),
},
Token {
kind: TJsr,
span: Span::default(),
},
Token {
kind: TIdent("ReadNum".to_string()),
span: Span::default(),
},
Token {
kind: TIstore,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TIload3,
span: Span::default(),
},
Token {
kind: TIload,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TJsr,
span: Span::default(),
},
Token {
kind: TIdent("AddNum".to_string()),
span: Span::default(),
},
Token {
kind: TIstore,
span: Span::default(),
},
Token {
kind: TInt(5),
span: Span::default(),
},
Token {
kind: TIload,
span: Span::default(),
},
Token {
kind: TInt(5),
span: Span::default(),
},
Token {
kind: TJsr,
span: Span::default(),
},
Token {
kind: TIdent("PrintSum".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TIdent("PrintSum".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TAstore,
span: Span::default(),
},
Token {
kind: TInt(7),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TSwap,
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/String/valueOf".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TRet,
span: Span::default(),
},
Token {
kind: TInt(7),
span: Span::default(),
},
Token {
kind: TIdent("AddNum".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TAstore,
span: Span::default(),
},
Token {
kind: TInt(6),
span: Span::default(),
},
Token {
kind: TIadd,
span: Span::default(),
},
Token {
kind: TRet,
span: Span::default(),
},
Token {
kind: TInt(6),
span: Span::default(),
},
Token {
kind: TIdent("ReadNum".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TAstore2,
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/util/Scanner/nextInt".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRet,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/AddNums.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_count_jasmin() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("CountJasmin".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TIstore2,
span: Span::default(),
},
Token {
kind: TIdent("loop".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TIload2,
span: Span::default(),
},
Token {
kind: TIsub,
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/String/valueOf".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TAstore3,
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TAload3,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TIinc,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TInt(-1),
span: Span::default(),
},
Token {
kind: TIload2,
span: Span::default(),
},
Token {
kind: TIfne,
span: Span::default(),
},
Token {
kind: TIdent("loop".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/CountJasmin.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_string_buffer_demo() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("StringBufferDemo".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("sbDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/Object;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TCheckcast,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/StringBuffer".to_string()),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("Hello, mundo!".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/StringBuffer/append".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/StringBuffer;".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TNew,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/StringBuffer".to_string()),
span: Span::default(),
},
Token {
kind: TDup,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/StringBuffer/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("StringBufferDemo/sbDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/Object;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/StringBuffer/toString".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/StringBufferDemo.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_array_demo() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("ArrayDemo".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("setArr".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[III".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TIload1,
span: Span::default(),
},
Token {
kind: TIload2,
span: Span::default(),
},
Token {
kind: TIastore,
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("printArr".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[II".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TIload1,
span: Span::default(),
},
Token {
kind: TIaload,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(5),
span: Span::default(),
},
Token {
kind: TNewarray,
span: Span::default(),
},
Token {
kind: TIdent("int".to_string()),
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TIaload,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(0),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("ArrayDemo/setArr".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[III".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TIastore,
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TIastore,
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TIastore,
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(5),
span: Span::default(),
},
Token {
kind: TIastore,
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(0),
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("ArrayDemo/printArr".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[II".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TIaload,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TIaload,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TIaload,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TIaload,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/ArrayDemo.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}
#[test]
fn test_lex_all_in_one() -> Result<(), Box> {
let expected_tokens = vec![
Token {
kind: TSource,
span: Span::default(),
},
Token {
kind: TIdent("AllInOne.pho".to_string()),
span: Span::default(),
},
Token {
kind: TClass,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("AllInOne".to_string()),
span: Span::default(),
},
Token {
kind: TSuper,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Thread".to_string()),
span: Span::default(),
},
Token {
kind: TField,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TIdent("x".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TField,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TIdent("y".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("D".to_string()),
span: Span::default(),
},
Token {
kind: TAssign,
span: Span::default(),
},
Token {
kind: TFloat(1.2345),
span: Span::default(),
},
Token {
kind: TField,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("z".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TAssign,
span: Span::default(),
},
Token {
kind: TInt(12345),
span: Span::default(),
},
Token {
kind: TField,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TFinal,
span: Span::default(),
},
Token {
kind: TIdent("PREFIX".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TAssign,
span: Span::default(),
},
Token {
kind: TString("FooBar".to_string()),
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TIdent("".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Thread/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("exceptionsDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TCatch,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Exception".to_string()),
span: Span::default(),
},
Token {
kind: TFrom,
span: Span::default(),
},
Token {
kind: TIdent("Label1".to_string()),
span: Span::default(),
},
Token {
kind: TTo,
span: Span::default(),
},
Token {
kind: TIdent("Label2".to_string()),
span: Span::default(),
},
Token {
kind: TUsing,
span: Span::default(),
},
Token {
kind: TIdent("Handler".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Label1".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TNew,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Exception".to_string()),
span: Span::default(),
},
Token {
kind: TDup,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Exception/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAthrow,
span: Span::default(),
},
Token {
kind: TIdent("Label2".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIdent("Handler".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TPop,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("Exception caught".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("finallyDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(4),
span: Span::default(),
},
Token {
kind: TCatch,
span: Span::default(),
},
Token {
kind: TIdent("java/io/FileNotFoundException".to_string()),
span: Span::default(),
},
Token {
kind: TFrom,
span: Span::default(),
},
Token {
kind: TIdent("Start".to_string()),
span: Span::default(),
},
Token {
kind: TTo,
span: Span::default(),
},
Token {
kind: TIdent("End1".to_string()),
span: Span::default(),
},
Token {
kind: TUsing,
span: Span::default(),
},
Token {
kind: TIdent("NotFound".to_string()),
span: Span::default(),
},
Token {
kind: TCatch,
span: Span::default(),
},
Token {
kind: TIdent("java/io/IOException".to_string()),
span: Span::default(),
},
Token {
kind: TFrom,
span: Span::default(),
},
Token {
kind: TIdent("Start".to_string()),
span: Span::default(),
},
Token {
kind: TTo,
span: Span::default(),
},
Token {
kind: TIdent("End2".to_string()),
span: Span::default(),
},
Token {
kind: TUsing,
span: Span::default(),
},
Token {
kind: TIdent("IOE".to_string()),
span: Span::default(),
},
Token {
kind: TCatch,
span: Span::default(),
},
Token {
kind: TIdent("all".to_string()),
span: Span::default(),
},
Token {
kind: TFrom,
span: Span::default(),
},
Token {
kind: TIdent("Start".to_string()),
span: Span::default(),
},
Token {
kind: TTo,
span: Span::default(),
},
Token {
kind: TIdent("Done".to_string()),
span: Span::default(),
},
Token {
kind: TUsing,
span: Span::default(),
},
Token {
kind: TIdent("Other_Exception".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Start".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TNew,
span: Span::default(),
},
Token {
kind: TIdent("java/io/FileInputStream".to_string()),
span: Span::default(),
},
Token {
kind: TDup,
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("myfile".to_string()),
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("java/io/FileInputStream/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TIdent("End1".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TGoto,
span: Span::default(),
},
Token {
kind: TIdent("Done".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("NotFound".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TPop,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("No such file".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TGoto,
span: Span::default(),
},
Token {
kind: TIdent("Done".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("IOE".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TPop,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("IO Exception occurred".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TGoto,
span: Span::default(),
},
Token {
kind: TIdent("Done".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("End2".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIdent("Done".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TJsr,
span: Span::default(),
},
Token {
kind: TIdent("FinalSub".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TIdent("Other_Exception".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TAstore2,
span: Span::default(),
},
Token {
kind: TJsr,
span: Span::default(),
},
Token {
kind: TIdent("FinalSub".to_string()),
span: Span::default(),
},
Token {
kind: TAload2,
span: Span::default(),
},
Token {
kind: TAthrow,
span: Span::default(),
},
Token {
kind: TIdent("FinalSub".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TAstore3,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("Done".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TRet,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TSynchronized,
span: Span::default(),
},
Token {
kind: TIdent("synchronizedMethoDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TIdent("monitoDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/Object;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TMonitorenter,
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TMonitorexit,
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TIdent("checkCastDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TCheckcast,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Object".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TIdent("instanceofDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TAload0,
span: Span::default(),
},
Token {
kind: TInstanceof,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/Thread".to_string()),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TSwap,
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/String/valueOf".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("subroutinesDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("Hello".to_string()),
span: Span::default(),
},
Token {
kind: TJsr,
span: Span::default(),
},
Token {
kind: TIdent("PrintString".to_string()),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString(", world".to_string()),
span: Span::default(),
},
Token {
kind: TJsr,
span: Span::default(),
},
Token {
kind: TIdent("PrintString".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TIdent("PrintString".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TSwap,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TRet,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("lookupswitchDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TIstore1,
span: Span::default(),
},
Token {
kind: TIload1,
span: Span::default(),
},
Token {
kind: TLookupswitch,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIdent("R1".to_string()),
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIdent("R2".to_string()),
span: Span::default(),
},
Token {
kind: TInt(100),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIdent("R3".to_string()),
span: Span::default(),
},
Token {
kind: TDefault,
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIdent("R4".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("R1".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIconst1,
span: Span::default(),
},
Token {
kind: TIreturn,
span: Span::default(),
},
Token {
kind: TIdent("R2".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIconst2,
span: Span::default(),
},
Token {
kind: TIreturn,
span: Span::default(),
},
Token {
kind: TIdent("R3".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIconst3,
span: Span::default(),
},
Token {
kind: TIreturn,
span: Span::default(),
},
Token {
kind: TIdent("R4".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIconst0,
span: Span::default(),
},
Token {
kind: TIreturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("tableswitchDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TIconst3,
span: Span::default(),
},
Token {
kind: TIstore1,
span: Span::default(),
},
Token {
kind: TIload1,
span: Span::default(),
},
Token {
kind: TTableswitch,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TIdent("R1".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("R2".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("R3".to_string()),
span: Span::default(),
},
Token {
kind: TDefault,
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIdent("R4".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("R1".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIconst1,
span: Span::default(),
},
Token {
kind: TIreturn,
span: Span::default(),
},
Token {
kind: TIdent("R2".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIconst2,
span: Span::default(),
},
Token {
kind: TIreturn,
span: Span::default(),
},
Token {
kind: TIdent("R3".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIconst3,
span: Span::default(),
},
Token {
kind: TIreturn,
span: Span::default(),
},
Token {
kind: TIdent("R4".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TIconst0,
span: Span::default(),
},
Token {
kind: TIreturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPrivate,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("varDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(1),
span: Span::default(),
},
Token {
kind: TVar,
span: Span::default(),
},
Token {
kind: TInt(0),
span: Span::default(),
},
Token {
kind: TIs,
span: Span::default(),
},
Token {
kind: TIdent("Count".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TFrom,
span: Span::default(),
},
Token {
kind: TIdent("Label1".to_string()),
span: Span::default(),
},
Token {
kind: TTo,
span: Span::default(),
},
Token {
kind: TIdent("Label2".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Label1".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TBipush,
span: Span::default(),
},
Token {
kind: TInt(10),
span: Span::default(),
},
Token {
kind: TIstore0,
span: Span::default(),
},
Token {
kind: TIdent("Label2".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
Token {
kind: TMethod,
span: Span::default(),
},
Token {
kind: TPublic,
span: Span::default(),
},
Token {
kind: TStatic,
span: Span::default(),
},
Token {
kind: TIdent("main".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("[Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TStack,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TLimit,
span: Span::default(),
},
Token {
kind: TLocals,
span: Span::default(),
},
Token {
kind: TInt(3),
span: Span::default(),
},
Token {
kind: TThrows,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/RuntimeException".to_string()),
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TLdc,
span: Span::default(),
},
Token {
kind: TString("Hello, world".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("AllInOne/exceptionsDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("AllInOne/finallyDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TNew,
span: Span::default(),
},
Token {
kind: TIdent("AllInOne".to_string()),
span: Span::default(),
},
Token {
kind: TDup,
span: Span::default(),
},
Token {
kind: TInvokespecial,
span: Span::default(),
},
Token {
kind: TIdent("AllInOne/".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAstore1,
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("AllInOne/instanceofDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TAload1,
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("AllInOne/checkCastDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("AllInOne/subroutinesDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("AllInOne/lookupswitchDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TJsr,
span: Span::default(),
},
Token {
kind: TIdent("PrintInt".to_string()),
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("AllInOne/tableswitchDemo".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TJsr,
span: Span::default(),
},
Token {
kind: TIdent("PrintInt".to_string()),
span: Span::default(),
},
Token {
kind: TReturn,
span: Span::default(),
},
Token {
kind: TIdent("PrintInt".to_string()),
span: Span::default(),
},
Token {
kind: TColon,
span: Span::default(),
},
Token {
kind: TAstore2,
span: Span::default(),
},
Token {
kind: TGetstatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/System/out".to_string()),
span: Span::default(),
},
Token {
kind: TIdent("Ljava/io/PrintStream;".to_string()),
span: Span::default(),
},
Token {
kind: TSwap,
span: Span::default(),
},
Token {
kind: TInvokestatic,
span: Span::default(),
},
Token {
kind: TIdent("java/lang/String/valueOf".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("I".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TInvokevirtual,
span: Span::default(),
},
Token {
kind: TIdent("java/io/PrintStream/println".to_string()),
span: Span::default(),
},
Token {
kind: TLeftParen,
span: Span::default(),
},
Token {
kind: TIdent("Ljava/lang/String;".to_string()),
span: Span::default(),
},
Token {
kind: TRightParen,
span: Span::default(),
},
Token {
kind: TIdent("V".to_string()),
span: Span::default(),
},
Token {
kind: TRet,
span: Span::default(),
},
Token {
kind: TInt(2),
span: Span::default(),
},
Token {
kind: TEnd,
span: Span::default(),
},
Token {
kind: TEndMethod,
span: Span::default(),
},
];
let actual_tokens = lex(Path::new("samples/AllInOne.pho"))?;
assert_eq!(expected_tokens, actual_tokens);
Ok(())
}