Я сейчас работаю над компилятором vba -> js, и я застрял с проблемой вызовов функций. В vba вы можете просто вызывать функцию по ее идентификатору следующим образом:
Foo
Object.Method
Object1.Method1 Object1.Prop, Object2.Method2 // same as Object1.Method1(Object1.Prop1, Object2.Method2())
На уровне грамматики вы не можете различить guish между вызовом функции в примере и простым доступом к проп. Потому что вы можете вызывать функцию следующим образом:
Foo Object.Prop // same as Foo(Object.Prop)
Foo Object.Method // same as Foo(Object.Method())
Та же проблема только с идентификатором:
Function Bar
Bar = 42
End Function
Dim Baz As Integer
Baz = 3
Foo Bar // same as Foo(Bar())
Foo Baz // same as Foo(Baz)
У меня есть реализация области действия в моем компиляторе. Так что я думаю, что единственный способ - это проверить, отклонена ли переменная в области видимости, а не в функции, так что относиться к ней как к идентификатору / подпорке? Как я могу реализовать механизм для различения guish доступа от вызова?