如何从Bison中的语法启动变量?

时间:2017-11-21 19:42:30

标签: c++ parsing bison interpreter

让我们假设我们有这个语法

start: 
expressions;
expressions:
           expressions expression 
           | expression 
           ;
expression:
          expression NAME value { float $2 = $3;}
          | NAME value  { float $1 = $2;}
          ;
value:
      INT '.' INT
      ;

对于这个语法,我们应用此输入

2.0 b 3.0

这应该由我们的语法解释(float a = 2.0; float b = 3.0;)

我的目标是使用名称声明一些变量,并使用构造函数执行某些操作,例如myClass NAME(value);而且价值是一个浮动。

问题是我不知道如何在我的例子中获得像语法一样的语法块的整个值以及如何在输入文件中的每一行中更改变量名称的声明并且不会有一些通用浮动a = $ 1;

我已经有我的flex tokeniser工作了,它会给我NAME和VALUE

1 个答案:

答案 0 :(得分:0)

您无法在C ++中使用字符串代替变量名称。你应该做的是定义一个从字符串到浮点数的映射,然后执行类似the_map[$2] = $3;而不是float $2 = $3;的操作。

在一个不相关的注释中,你需要向value添加一个动作,使其产生一个浮点值(或让你的词法分析器为浮点数生成一个标记并使用它)。否则,$3expression的操作中使用时,import asyncio import aiohttp import gidgethub from gidgethub.aiohttp import GitHubAPI # TODO # paste your token to have rate limits # https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/ TOKEN = '...' async def get_all_pulls_for_repo(gh, org, repo): pulls = [] async for pull in gh.getiter(f'/repos/{org}/{repo}/pulls?state=all'): pulls.append(pull) await gh.sleep(0.1) # avoid RateLimitExceeded, you should count it somehow return pulls async def main(): org = 'brettcannon' repos = ['gidgethub', 'caniusepython3', 'importlib_resources'] async with aiohttp.ClientSession() as session: gh = GitHubAPI(session, 'requester', oauth_token=TOKEN) tasks = [ asyncio.ensure_future(get_all_pulls_for_repo(gh, org, repo)) for repo in repos ] results = await asyncio.gather(*tasks) for res in results: for pull in res: print(pull['url']) loop = asyncio.get_event_loop() try: loop.run_until_complete(main()) finally: loop.run_until_complete(loop.shutdown_asyncgens()) loop.close() 没有正确的值。