amplify-education / python-hcl2

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Two ternary operators - fail to parse

jeremycarroll opened this issue · comments

I had a parse error that I reduced to

resource "aws_instance" "jenkins_controller" {
  user_data = var.color == "blue" ? 0 :  1
  tags = {
    email          = var.assignee == "" ? null : var.assignee
    color          = var.color
  }
}

results in

Traceback (most recent call last):
  File "/Users/jcarroll/.local/share/virtualenvs/codeowners-dsyKmJWy/lib/python3.11/site-packages/lark/parsers/lalr_parser.py", line 126, in feed_token
    action, arg = states[state][token.type]
                  ~~~~~~~~~~~~~^^^^^^^^^^^^
KeyError: '__ANON_3'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/Users/jcarroll/.local/share/virtualenvs/codeowners-dsyKmJWy/lib/python3.11/site-packages/hcl2/api.py", line 14, in load
    return loads(file.read(), with_meta=with_meta)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/jcarroll/.local/share/virtualenvs/codeowners-dsyKmJWy/lib/python3.11/site-packages/hcl2/api.py", line 27, in loads
    tree = hcl2.parse(text + "\n")
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/jcarroll/.local/share/virtualenvs/codeowners-dsyKmJWy/lib/python3.11/site-packages/lark/lark.py", line 645, in parse
    return self.parser.parse(text, start=start, on_error=on_error)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/jcarroll/.local/share/virtualenvs/codeowners-dsyKmJWy/lib/python3.11/site-packages/lark/parser_frontends.py", line 96, in parse
    return self.parser.parse(stream, chosen_start, **kw)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/jcarroll/.local/share/virtualenvs/codeowners-dsyKmJWy/lib/python3.11/site-packages/lark/parsers/lalr_parser.py", line 41, in parse
    return self.parser.parse(lexer, start)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/jcarroll/.local/share/virtualenvs/codeowners-dsyKmJWy/lib/python3.11/site-packages/lark/parsers/lalr_parser.py", line 171, in parse
    return self.parse_from_state(parser_state)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/jcarroll/.local/share/virtualenvs/codeowners-dsyKmJWy/lib/python3.11/site-packages/lark/parsers/lalr_parser.py", line 193, in parse_from_state
    raise e
  File "/Users/jcarroll/.local/share/virtualenvs/codeowners-dsyKmJWy/lib/python3.11/site-packages/lark/parsers/lalr_parser.py", line 184, in parse_from_state
    state.feed_token(token)
  File "/Users/jcarroll/.local/share/virtualenvs/codeowners-dsyKmJWy/lib/python3.11/site-packages/lark/parsers/lalr_parser.py", line 129, in feed_token
    raise UnexpectedToken(token, expected, state=self, interactive_parser=None)
lark.exceptions.UnexpectedToken: Unexpected token Token('__ANON_3', 'color') at line 5, column 5.
Expected one of: 
	* SLASH
	* QMARK
	* __ANON_4
	* __ANON_0
	* STAR
	* MINUS
	* PLUS
	* COMMA
	* __ANON_8
	* __ANON_9
	* __ANON_5
	* __ANON_2
	* __ANON_7
	* PERCENT
	* MORETHAN
	* RBRACE
	* __ANON_6
	* LESSTHAN
	* __ANON_1

Python 3.11.3; HCL2: 4.3.2

If you make parentheses for the entire ternary or for only a condition, it works.
like those:

resource "aws_instance" "jenkins_controller" {
  user_data = var.color == "blue" ? 0 :  1
  tags = {
    email          = (var.assignee == "" ? null : var.assignee)
    color          = var.color
  }
}

or

resource "aws_instance" "jenkins_controller" {
  user_data = var.color == "blue" ? 0 :  1
  tags = {
    email          = (var.assignee == "") ? null : var.assignee
    color          = var.color
  }
}

@IButskhrikidze - I am trying to parse all the code in a repo, and it is what it is ... The parser is very close, but even one or two errors cause pain

For me this bug appeared in 4.3.1; downgrading to 4.3.0 fixed it.

I have the same issue with 4.3.1 for a binary operation : priority = 20 + value.

When downgrading to 4.3.0, everything is OK.

also broken for multi-line ternary even if wrapped in ().

(var.foo ? 1 : 2) works

this does not

(
  var.foo
  ? 1
  : 2
)