mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This commit also adds ArrayExpr and DictionaryExpr to the libSyntax nodes family. Also, it refactors the original parser code for these two expressions to better fit to the design of SyntaxParsingContext. This commit has also fixed two crashers.
158 lines
4.9 KiB
Python
158 lines
4.9 KiB
Python
from Child import Child
|
|
from Node import Node # noqa: I201
|
|
|
|
EXPR_NODES = [
|
|
# An inout expression.
|
|
# &x
|
|
Node('InOutExpr', kind='Expr',
|
|
children=[
|
|
Child('Ampersand', kind='AmpersandToken'),
|
|
Child('Identifier', kind='IdentifierToken'),
|
|
]),
|
|
|
|
# A #column expression.
|
|
Node('PoundColumnExpr', kind='Expr',
|
|
children=[
|
|
Child('PoundColumn', kind='PoundColumnToken'),
|
|
]),
|
|
|
|
Node('FunctionCallArgumentList', kind='SyntaxCollection',
|
|
element='FunctionCallArgument'),
|
|
|
|
Node('ArrayElementList', kind='SyntaxCollection',
|
|
element='ArrayElement'),
|
|
|
|
Node('DictionaryElementList', kind='SyntaxCollection',
|
|
element='DictionaryElement'),
|
|
|
|
# The try operator.
|
|
# try foo()
|
|
# try? foo()
|
|
# try! foo()
|
|
Node('TryOperator', kind='Syntax',
|
|
children=[
|
|
Child('TryKeyword', kind='TryToken'),
|
|
Child('QuestionOrExclamationMark', kind='Token',
|
|
is_optional=True,
|
|
token_choices=[
|
|
'PostfixQuestionMarkToken',
|
|
'ExclamationMarkToken',
|
|
]),
|
|
]),
|
|
|
|
# A #line expression.
|
|
Node('PoundLineExpr', kind='Expr',
|
|
children=[
|
|
Child('PoundLine', kind='PoundLineToken'),
|
|
]),
|
|
|
|
# A #file expression.
|
|
Node('PoundFileExpr', kind='Expr',
|
|
children=[
|
|
Child('PoundFile', kind='PoundFileToken'),
|
|
]),
|
|
|
|
# A #function expression.
|
|
Node('PoundFunctionExpr', kind='Expr',
|
|
children=[
|
|
Child('PoundFunction', kind='PoundFunctionToken'),
|
|
]),
|
|
|
|
# symbolic-reference-expression -> identifier generic-argument-clause?
|
|
Node('SymbolicReferenceExpr', kind='Expr',
|
|
children=[
|
|
Child('Identifier', kind='IdentifierToken'),
|
|
Child('GenericArgumentClause', kind='GenericArgumentClause',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# A prefix operator expression.
|
|
# -x
|
|
# !true
|
|
Node('PrefixOperatorExpr', kind='Expr',
|
|
children=[
|
|
Child('OperatorToken', kind='PrefixOperatorToken',
|
|
is_optional=True),
|
|
Child('PostfixExpression', kind='Expr'),
|
|
]),
|
|
|
|
# A floating-point literal
|
|
# 4.0
|
|
# -3.9
|
|
# +4e20
|
|
Node('FloatLiteralExpr', kind='Expr',
|
|
children=[
|
|
Child('Sign', kind='PrefixOperatorToken',
|
|
is_optional=True),
|
|
Child('FloatingDigits', kind='FloatingLiteralToken'),
|
|
]),
|
|
|
|
Node('FunctionCallExpr', kind='Expr',
|
|
children=[
|
|
Child('CalledExpression', kind='Expr'),
|
|
Child('LeftParen', kind='LeftParenToken'),
|
|
Child('ArgumentList', kind='FunctionCallArgumentList'),
|
|
Child('RightParen', kind='RightParenToken'),
|
|
]),
|
|
|
|
# Array literal, e.g. [1, 2, 3]
|
|
Node('ArrayExpr', kind='Expr',
|
|
children=[
|
|
Child('LeftSquare', kind='LeftSquareToken'),
|
|
Child('Elements', kind='ArrayElementList'),
|
|
Child('RightSquare', kind='RightSquareToken'),
|
|
]),
|
|
|
|
# Dictionary literal, e.g. [1:1, 2:2, 3:3]
|
|
Node('DictionaryExpr', kind='Expr',
|
|
children=[
|
|
Child('LeftSquare', kind='LeftSquareToken'),
|
|
Child('Elements', kind='DictionaryElementList'),
|
|
Child('RightSquare', kind='RightSquareToken'),
|
|
]),
|
|
|
|
# function-call-argument -> label? ':'? expression ','?
|
|
Node('FunctionCallArgument', kind='Syntax',
|
|
children=[
|
|
Child('Label', kind='IdentifierToken',
|
|
is_optional=True),
|
|
Child('Colon', kind='ColonToken',
|
|
is_optional=True),
|
|
Child('Expression', kind='Expr'),
|
|
Child('TrailingComma', kind='CommaToken',
|
|
is_optional=True),
|
|
]),
|
|
|
|
# element inside an array expression: expression ','?
|
|
Node('ArrayElement', kind='Syntax',
|
|
children=[
|
|
Child('Expression', kind='Expr'),
|
|
Child('TrailingComma', kind='CommaToken', is_optional=True),
|
|
]),
|
|
|
|
# element inside an array expression: expression ','?
|
|
Node('DictionaryElement', kind='Syntax',
|
|
children=[
|
|
Child('KeyExpression', kind='Expr'),
|
|
Child('Colon', kind='ColonToken'),
|
|
Child('ValueExpression', kind='Expr'),
|
|
Child('TrailingComma', kind='CommaToken', is_optional=True),
|
|
]),
|
|
|
|
# An integer literal.
|
|
# 3
|
|
# +3_400
|
|
# +0x4f
|
|
Node('IntegerLiteralExpr', kind='Expr',
|
|
children=[
|
|
Child('Sign', kind='PrefixOperatorToken',
|
|
is_optional=True),
|
|
Child('Digits', kind='IntegerLiteralToken'),
|
|
]),
|
|
|
|
Node('StringLiteralExpr', kind='Expr',
|
|
children=[
|
|
Child("StringLiteral", kind='StringLiteralToken')
|
|
])
|
|
]
|