cairo-lang-parser 2.18.0

Cairo parser.
Documentation
//! > Test a syntax tree with literals

//! > test_runner_name
test_partial_parser_tree(expect_diagnostics: false)

//! > cairo_code
fn f() {
    let a = 0x123 + 456 + 'abc';
}

//! > top_level_kind
StatementLet

//! > ignored_kinds
ExprPath

//! > expected_diagnostics

//! > expected_tree
└── Top level kind: StatementLet
    ├── attributes (kind: AttributeList) []
    ├── let_kw (kind: TokenLet): 'let'
    ├── pattern (kind: ExprPath) <ignored>
    ├── type_clause (kind: OptionTypeClauseEmpty) []
    ├── eq (kind: TokenEq): '='
    ├── rhs (kind: ExprBinary)
    │   ├── lhs (kind: ExprBinary)
    │   │   ├── lhs (kind: TokenLiteralNumber): '0x123'
    │   │   ├── op (kind: TokenPlus): '+'
    │   │   └── rhs (kind: TokenLiteralNumber): '456'
    │   ├── op (kind: TokenPlus): '+'
    │   └── rhs (kind: TokenShortString): ''abc''
    ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    └── semicolon (kind: TokenSemicolon): ';'

//! > ==========================================================================

//! > Test a syntax tree with literals with suffixes

//! > test_runner_name
test_partial_parser_tree(expect_diagnostics: false)

//! > cairo_code
fn f() {
    let a = 0x123_u8 + 456_u256 + 'abc'_u16;
}

//! > top_level_kind
StatementLet

//! > ignored_kinds
ExprPath

//! > expected_diagnostics

//! > expected_tree
└── Top level kind: StatementLet
    ├── attributes (kind: AttributeList) []
    ├── let_kw (kind: TokenLet): 'let'
    ├── pattern (kind: ExprPath) <ignored>
    ├── type_clause (kind: OptionTypeClauseEmpty) []
    ├── eq (kind: TokenEq): '='
    ├── rhs (kind: ExprBinary)
    │   ├── lhs (kind: ExprBinary)
    │   │   ├── lhs (kind: TokenLiteralNumber): '0x123_u8'
    │   │   ├── op (kind: TokenPlus): '+'
    │   │   └── rhs (kind: TokenLiteralNumber): '456_u256'
    │   ├── op (kind: TokenPlus): '+'
    │   └── rhs (kind: TokenShortString): ''abc'_u16'
    ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    └── semicolon (kind: TokenSemicolon): ';'

//! > ==========================================================================

//! > Test a syntax tree with literals with unary minuses

//! > test_runner_name
test_partial_parser_tree(expect_diagnostics: false)

//! > cairo_code
fn f() {
    let a = -0x123_u8 + -456_u256 + -'abc'_u16;
}

//! > top_level_kind
StatementLet

//! > ignored_kinds
ExprPath

//! > expected_diagnostics

//! > expected_tree
└── Top level kind: StatementLet
    ├── attributes (kind: AttributeList) []
    ├── let_kw (kind: TokenLet): 'let'
    ├── pattern (kind: ExprPath) <ignored>
    ├── type_clause (kind: OptionTypeClauseEmpty) []
    ├── eq (kind: TokenEq): '='
    ├── rhs (kind: ExprBinary)
    │   ├── lhs (kind: ExprBinary)
    │   │   ├── lhs (kind: ExprUnary)
    │   │   │   ├── op (kind: TokenMinus): '-'
    │   │   │   └── expr (kind: TokenLiteralNumber): '0x123_u8'
    │   │   ├── op (kind: TokenPlus): '+'
    │   │   └── rhs (kind: ExprUnary)
    │   │       ├── op (kind: TokenMinus): '-'
    │   │       └── expr (kind: TokenLiteralNumber): '456_u256'
    │   ├── op (kind: TokenPlus): '+'
    │   └── rhs (kind: ExprUnary)
    │       ├── op (kind: TokenMinus): '-'
    │       └── expr (kind: TokenShortString): ''abc'_u16'
    ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    └── semicolon (kind: TokenSemicolon): ';'

//! > ==========================================================================

//! > Invalid literals.

//! > test_runner_name
test_partial_parser_tree(expect_diagnostics: true)

//! > cairo_code
fn foo() {
    let legal_bin = 0b1;
    let illegal_bin = 0b2;
    let illegal_bin = 0b12;
    let legal_oct = 0o1;
    let illegal_oct = 0o8;
    let illegal_oct = 0o78;
    let legal_hex = 0xf;
    let illegal_hex = 0xg;
    let illegal_hex = 0xfg;
    let missing_suffix = 10000000_;
}

//! > top_level_kind
StatementList

//! > ignored_kinds
ExprPath

//! > expected_diagnostics
error[E1016]: Literal is not a valid number.
 --> dummy_file.cairo:3:23
    let illegal_bin = 0b2;
                      ^^

error[E1001]: Missing token ';'.
 --> dummy_file.cairo:3:25
    let illegal_bin = 0b2;
                        ^

error[E1001]: Missing token ';'.
 --> dummy_file.cairo:4:26
    let illegal_bin = 0b12;
                         ^

error[E1016]: Literal is not a valid number.
 --> dummy_file.cairo:6:23
    let illegal_oct = 0o8;
                      ^^

error[E1001]: Missing token ';'.
 --> dummy_file.cairo:6:25
    let illegal_oct = 0o8;
                        ^

error[E1001]: Missing token ';'.
 --> dummy_file.cairo:7:26
    let illegal_oct = 0o78;
                         ^

error[E1016]: Literal is not a valid number.
 --> dummy_file.cairo:9:23
    let illegal_hex = 0xg;
                      ^^

error[E1001]: Missing token ';'.
 --> dummy_file.cairo:9:25
    let illegal_hex = 0xg;
                        ^

error[E1001]: Missing token ';'.
 --> dummy_file.cairo:10:26
    let illegal_hex = 0xfg;
                         ^

error[E1015]: Missing literal suffix.
 --> dummy_file.cairo:11:35
    let missing_suffix = 10000000_;
                                  ^

//! > expected_tree
└── Top level kind: StatementList
    ├── child #0 (kind: StatementLet)
    │   ├── attributes (kind: AttributeList) []
    │   ├── let_kw (kind: TokenLet): 'let'
    │   ├── pattern (kind: ExprPath) <ignored>
    │   ├── type_clause (kind: OptionTypeClauseEmpty) []
    │   ├── eq (kind: TokenEq): '='
    │   ├── rhs (kind: TokenLiteralNumber): '0b1'
    │   ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    │   └── semicolon (kind: TokenSemicolon): ';'
    ├── child #1 (kind: StatementLet)
    │   ├── attributes (kind: AttributeList) []
    │   ├── let_kw (kind: TokenLet): 'let'
    │   ├── pattern (kind: ExprPath) <ignored>
    │   ├── type_clause (kind: OptionTypeClauseEmpty) []
    │   ├── eq (kind: TokenEq): '='
    │   ├── rhs (kind: TokenLiteralNumber): '0b'
    │   ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    │   └── semicolon: Missing
    ├── child #2 (kind: StatementExpr)
    │   ├── attributes (kind: AttributeList) []
    │   ├── expr (kind: TokenLiteralNumber): '2'
    │   └── semicolon (kind: TokenSemicolon): ';'
    ├── child #3 (kind: StatementLet)
    │   ├── attributes (kind: AttributeList) []
    │   ├── let_kw (kind: TokenLet): 'let'
    │   ├── pattern (kind: ExprPath) <ignored>
    │   ├── type_clause (kind: OptionTypeClauseEmpty) []
    │   ├── eq (kind: TokenEq): '='
    │   ├── rhs (kind: TokenLiteralNumber): '0b1'
    │   ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    │   └── semicolon: Missing
    ├── child #4 (kind: StatementExpr)
    │   ├── attributes (kind: AttributeList) []
    │   ├── expr (kind: TokenLiteralNumber): '2'
    │   └── semicolon (kind: TokenSemicolon): ';'
    ├── child #5 (kind: StatementLet)
    │   ├── attributes (kind: AttributeList) []
    │   ├── let_kw (kind: TokenLet): 'let'
    │   ├── pattern (kind: ExprPath) <ignored>
    │   ├── type_clause (kind: OptionTypeClauseEmpty) []
    │   ├── eq (kind: TokenEq): '='
    │   ├── rhs (kind: TokenLiteralNumber): '0o1'
    │   ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    │   └── semicolon (kind: TokenSemicolon): ';'
    ├── child #6 (kind: StatementLet)
    │   ├── attributes (kind: AttributeList) []
    │   ├── let_kw (kind: TokenLet): 'let'
    │   ├── pattern (kind: ExprPath) <ignored>
    │   ├── type_clause (kind: OptionTypeClauseEmpty) []
    │   ├── eq (kind: TokenEq): '='
    │   ├── rhs (kind: TokenLiteralNumber): '0o'
    │   ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    │   └── semicolon: Missing
    ├── child #7 (kind: StatementExpr)
    │   ├── attributes (kind: AttributeList) []
    │   ├── expr (kind: TokenLiteralNumber): '8'
    │   └── semicolon (kind: TokenSemicolon): ';'
    ├── child #8 (kind: StatementLet)
    │   ├── attributes (kind: AttributeList) []
    │   ├── let_kw (kind: TokenLet): 'let'
    │   ├── pattern (kind: ExprPath) <ignored>
    │   ├── type_clause (kind: OptionTypeClauseEmpty) []
    │   ├── eq (kind: TokenEq): '='
    │   ├── rhs (kind: TokenLiteralNumber): '0o7'
    │   ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    │   └── semicolon: Missing
    ├── child #9 (kind: StatementExpr)
    │   ├── attributes (kind: AttributeList) []
    │   ├── expr (kind: TokenLiteralNumber): '8'
    │   └── semicolon (kind: TokenSemicolon): ';'
    ├── child #10 (kind: StatementLet)
    │   ├── attributes (kind: AttributeList) []
    │   ├── let_kw (kind: TokenLet): 'let'
    │   ├── pattern (kind: ExprPath) <ignored>
    │   ├── type_clause (kind: OptionTypeClauseEmpty) []
    │   ├── eq (kind: TokenEq): '='
    │   ├── rhs (kind: TokenLiteralNumber): '0xf'
    │   ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    │   └── semicolon (kind: TokenSemicolon): ';'
    ├── child #11 (kind: StatementLet)
    │   ├── attributes (kind: AttributeList) []
    │   ├── let_kw (kind: TokenLet): 'let'
    │   ├── pattern (kind: ExprPath) <ignored>
    │   ├── type_clause (kind: OptionTypeClauseEmpty) []
    │   ├── eq (kind: TokenEq): '='
    │   ├── rhs (kind: TokenLiteralNumber): '0x'
    │   ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    │   └── semicolon: Missing
    ├── child #12 (kind: StatementExpr)
    │   ├── attributes (kind: AttributeList) []
    │   ├── expr (kind: ExprPath) <ignored>
    │   └── semicolon (kind: TokenSemicolon): ';'
    ├── child #13 (kind: StatementLet)
    │   ├── attributes (kind: AttributeList) []
    │   ├── let_kw (kind: TokenLet): 'let'
    │   ├── pattern (kind: ExprPath) <ignored>
    │   ├── type_clause (kind: OptionTypeClauseEmpty) []
    │   ├── eq (kind: TokenEq): '='
    │   ├── rhs (kind: TokenLiteralNumber): '0xf'
    │   ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    │   └── semicolon: Missing
    ├── child #14 (kind: StatementExpr)
    │   ├── attributes (kind: AttributeList) []
    │   ├── expr (kind: ExprPath) <ignored>
    │   └── semicolon (kind: TokenSemicolon): ';'
    └── child #15 (kind: StatementLet)
        ├── attributes (kind: AttributeList) []
        ├── let_kw (kind: TokenLet): 'let'
        ├── pattern (kind: ExprPath) <ignored>
        ├── type_clause (kind: OptionTypeClauseEmpty) []
        ├── eq (kind: TokenEq): '='
        ├── rhs (kind: TokenLiteralNumber): '10000000_'
        ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
        └── semicolon (kind: TokenSemicolon): ';'

//! > ==========================================================================

//! > Test short string suffix missing underscore

//! > test_runner_name
test_partial_parser_tree(expect_diagnostics: true)

//! > cairo_code
fn foo() {
    let a = 'a'u16;
}

//! > top_level_kind
StatementLet

//! > ignored_kinds
ExprPath

//! > expected_diagnostics
error[E1001]: Missing token ';'.
 --> dummy_file.cairo:2:16
    let a = 'a'u16;
               ^

//! > expected_tree
└── Top level kind: StatementLet
    ├── attributes (kind: AttributeList) []
    ├── let_kw (kind: TokenLet): 'let'
    ├── pattern (kind: ExprPath) <ignored>
    ├── type_clause (kind: OptionTypeClauseEmpty) []
    ├── eq (kind: TokenEq): '='
    ├── rhs (kind: TokenShortString): ''a''
    ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    └── semicolon: Missing