Skip to content

Instantly share code, notes, and snippets.

@zurk

zurk/example.py Secret

Last active September 22, 2017 10:21
Show Gist options
  • Save zurk/66a3045746287bdb5002c0812b94f611 to your computer and use it in GitHub Desktop.
Save zurk/66a3045746287bdb5002c0812b94f611 to your computer and use it in GitHub Desktop.
UAST Role assignment example for a == b == c
a = b = c
var1 == var2 == var3
var4 < var5 < var6
//*[@roleIdentifier] :
<a>: [(6, 'LEFT'), (1, 'IDENTIFIER'), (18, 'EXPRESSION')]
<b>: [(6, 'LEFT'), (1, 'IDENTIFIER'), (18, 'EXPRESSION')]
<c>: [(7, 'RIGHT'), (1, 'IDENTIFIER'), (18, 'EXPRESSION')]
<var2>: [(1, 'IDENTIFIER'), (18, 'EXPRESSION')]
<var3>: [(1, 'IDENTIFIER'), (18, 'EXPRESSION')]
<var1>: [(1, 'IDENTIFIER'), (18, 'EXPRESSION'), (18, 'EXPRESSION'), (4, 'BINARY'), (6, 'LEFT')]
<var5>: [(1, 'IDENTIFIER'), (18, 'EXPRESSION')]
<var6>: [(1, 'IDENTIFIER'), (18, 'EXPRESSION')]
<var4>: [(1, 'IDENTIFIER'), (18, 'EXPRESSION'), (18, 'EXPRESSION'), (4, 'BINARY'), (6, 'LEFT')]
//*[@roleLeft] :
<a>: [(6, 'LEFT'), (1, 'IDENTIFIER'), (18, 'EXPRESSION')]
<b>: [(6, 'LEFT'), (1, 'IDENTIFIER'), (18, 'EXPRESSION')]
<var1>: [(1, 'IDENTIFIER'), (18, 'EXPRESSION'), (18, 'EXPRESSION'), (4, 'BINARY'), (6, 'LEFT')]
<var4>: [(1, 'IDENTIFIER'), (18, 'EXPRESSION'), (18, 'EXPRESSION'), (4, 'BINARY'), (6, 'LEFT')]
//*[@roleRight] :
<c>: [(7, 'RIGHT'), (1, 'IDENTIFIER'), (18, 'EXPRESSION')]
<>: [(18, 'EXPRESSION'), (4, 'BINARY'), (7, 'RIGHT')]
<>: [(18, 'EXPRESSION'), (4, 'BINARY'), (7, 'RIGHT')]
//*[@roleBinary] :
<>: [(4, 'BINARY'), (105, 'THIS'), (18, 'EXPRESSION')]
<>: [(18, 'EXPRESSION'), (4, 'BINARY')]
<>: [(18, 'EXPRESSION'), (4, 'BINARY'), (7, 'RIGHT')]
<var1>: [(1, 'IDENTIFIER'), (18, 'EXPRESSION'), (18, 'EXPRESSION'), (4, 'BINARY'), (6, 'LEFT')]
<>: [(18, 'EXPRESSION'), (4, 'BINARY'), (3, 'OPERATOR')]
<==>: [(4, 'BINARY'), (3, 'OPERATOR'), (20, 'EQUAL')]
<==>: [(4, 'BINARY'), (3, 'OPERATOR'), (20, 'EQUAL')]
<>: [(18, 'EXPRESSION'), (4, 'BINARY')]
<>: [(18, 'EXPRESSION'), (4, 'BINARY'), (7, 'RIGHT')]
<var4>: [(1, 'IDENTIFIER'), (18, 'EXPRESSION'), (18, 'EXPRESSION'), (4, 'BINARY'), (6, 'LEFT')]
<>: [(18, 'EXPRESSION'), (4, 'BINARY'), (3, 'OPERATOR')]
<<>: [(4, 'BINARY'), (3, 'OPERATOR'), (22, 'LESS_THAN')]
<<>: [(4, 'BINARY'), (3, 'OPERATOR'), (22, 'LESS_THAN')]
//*[@roleThis] :
import bblfsh
from bblfsh import BblfshClient
import importlib
DESCRIPTOR = importlib.import_module(
"bblfsh.gopkg.in.bblfsh.sdk.%s.uast.generated_pb2" % bblfsh.sdkversion.VERSION).DESCRIPTOR
Node = importlib.import_module(
"bblfsh.gopkg.in.bblfsh.sdk.%s.uast.generated_pb2" % bblfsh.sdkversion.VERSION).Node
def _role_id(role_name):
return DESCRIPTOR.enum_types_by_name["Role"].values_by_name[role_name].number
def _role_name(role_id):
return DESCRIPTOR.enum_types_by_name["Role"].values_by_number[role_id].name
def get_token_roles_list(response, xpath):
tokens = []
for node in bblfsh.filter(response.uast, xpath):
tokens.append((node.token, [(k, _role_name(k)) for k in node.roles]))
print('\n'.join("<{}>:{} {}".format(t, " "* (12 - len(t)), r) for t, r in tokens))
client = BblfshClient("0.0.0.0:9432")
filepath = "./example.py"
response = client.parse(filepath)
# Get all Simple Identifiers in UAST
for xpath in ["//*[@roleIdentifier]", "//*[@roleLeft]", "//*[@roleRight]", "//*[@roleBinary]", "//*[@roleThis]"]:
print(xpath, ":")
get_token_roles_list(response, xpath)
print()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment